为什么在EXEC的参数中连接字符串有时会导致T-SQL中出现语法错误?

Tim*_*man 11 t-sql concatenation exec

在MS SQL Server Management Studio 2005中,运行此代码

EXEC('SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR))
Run Code Online (Sandbox Code Playgroud)

给出了这个错误: Incorrect syntax near 'CAST'

但是,如果我这样做,它的工作原理:

DECLARE @temp VARCHAR(4000)
SET @temp = 'SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR)
EXEC(@temp)
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一个解释:T-SQL:不能将连接字符串作为参数传递给存储过程

根据接受的答案,EXEC可以将局部变量或值作为其参数,而不是表达式.

但是,如果是这种情况,为什么这样做:

DECLARE @temp VARCHAR(4000)
SET @temp = CAST(3 AS VARCHAR)
EXEC('SELECT * FROM employees WHERE employeeID = ' + @temp)
Run Code Online (Sandbox Code Playgroud)

'SELECT * FROM employees WHERE employeeID = ' + @temp 肯定看起来像一个表达式,但代码执行没有错误.

Luk*_*keH 10

文档声明EXEC可以采用字符串变量,常量T-SQL字符串或两者的组合/连接.

您的"为什么这个工作"示例使用常量T-SQL字符串和字符串变量的串联,因此完全合法.