2013-06-18 91 views
1

我的一些代码,我继承了跨越该位TSQL的传来:(?作​​为一个笑话也许)奇怪的SQL查询

DECLARE @a NVARCHAR(1000) , 
    @b NVARCHAR(4) 
SET @b = (SELECT RIGHT(CAST(SQL_VARIANT_PROPERTY('#', 'basetype') AS VARCHAR(7)), 
          4) 
     ) 
SET @a = SUBSTRING(object_definition(OBJECT_ID('sys.sp_columns')), 399, 6) 
    + ' ' + @b + '(' + REPLACE(REPLACE(REPLACE('^5231^42310123^623^5', 
               '^', '11'), '3', 
             ' + ' + @b + '('), '2', ')') 
    + ') '' ''' 
EXEC sp_executesql @a 

它输出的结果“秘密”到查询窗口。我不知道为什么要做这个代码或者是谁做的。有人可以试图向我解释它是如何工作的吗?它有什么用处,或者我可以把它撕掉吗?

+1

尝试解释?谷歌什么'SQL_VARIANT_PROPERTY'。 Google'object_definition'。这是学习如何钓鱼,而不是只给鱼。它使你成为一个更好的开发者。 –

+1

在2008年,这生成了'elect char(115)+ char(101)+ char(99)+ char(114)+ char(101)+ char(116)+ char(115)'''这是无效语法。我认为'sys.sp_columns'的定义已经改变了。 –

+1

看起来开发商手中有很多额外的时间。 – Delebrin

回答

2

只需将它分解为你一点点,

select sql_variant_property('#','basetype') = 'varchar' 
select right('varchar',4) = 'char' 
select object_definition(object_id('sys.sp_columns')) = [sys.sp_colums tsql] 
select substring(sys.sp_colums tsql,399,6) = 'select' 

这样:

@a = 'select select char(115) + char(101) + char(99) + char(114) + char(101) + char(116) + char(115) ' '' 

exec sp_executesql @a = 'secrets' 

它基本上是对他们的手中的一些额外的时间和希望,使一些过于复杂的人的情况。可能认为这很有趣。

我希望它没有被使用。

2

它的生成和执行查询的一个非常迂回的方式:

select char(115) + char(101) + char(99) + char(114) + char(101) + char(116) + char(115) ' ' 

这是写作的另一种方式:

select 'secrets' as ' ' 

无论它什么有用取决于该查询是如何被调用 - 是否有可能比一个应用程序调用它来获得(非常差)的密码或加密密钥?