SQL - Exec(string + null) - 这是一个bug还是设计?

时间:2014-08-21 03:15:16

标签: sql sql-server

我正在修改一个旧的SQL查询代码,但无法弄清楚新版本无法正常工作的原因。以下是最简单的代码版本。

- 旧版

declare @query as varchar(10)
set @query = null
print 'test1'
exec('print ''a'''+@query+';print ''b''')

- 新版本

declare @query as varchar(10)
declare @text varchar(20)
set @text = null
set @query = 'print ''a'''+@text+';print ''b'''
print 'test2'
exec (@query)

结果

test1
a
b

test2

使用字符串+ null运行exec会自动忽略null。这是设计还是记录在某处?或者这是一个错误?我肯定错过了什么。有人可以解释一下吗?

任何人都可以发布mysql结果吗?感谢。

1 个答案:

答案 0 :(得分:1)

documentation说明语法:

Execute a character string
{ EXEC | EXECUTE } 
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
    [ AS {  USER } = ' name ' ]
[;]

所以,我的猜测是表达式+中的'print ''a'''+@query+';print ''b'''没有被解释为字符串连接,而只是作为exec命令语法的一部分。

这可以解释为什么行为不同;虽然不是它是一个错误还是一个功能。

将上述内容与print的文档进行对比:

PRINT msg_str | @local_variable | string_expr
     

...
  string_expr
      是一个返回字符串的表达式。可以包含连接的文字值,函数和变量。有关更多信息,请参阅表达式(Transact-SQL)。

请注意,print仅引用"字符串表达式",其中exec定义了自己的语法。