Почему конкатенация строк в аргументе EXEC иногда вызывает синтаксическую ошибку в T-SQL?
В MS SQL Server Management Studio 2005 выполняется этот код
EXEC('SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR))
дает эту ошибку: Incorrect syntax near 'CAST'
Однако, если я это сделаю, он работает:
DECLARE @temp VARCHAR(4000)
SET @temp = 'SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR)
EXEC(@temp)
Я нашел объяснение здесь: T-SQL: не удается передать конкатенированную строку в качестве аргумента хранимой процедуры
В соответствии с принятым ответом EXEC
может принимать локальную переменную или значение в качестве своего аргумента, но не выражение.
Однако, если это так, почему это работает:
DECLARE @temp VARCHAR(4000)
SET @temp = CAST(3 AS VARCHAR)
EXEC('SELECT * FROM employees WHERE employeeID = ' + @temp)
'SELECT * FROM employees WHERE employeeID = ' + @temp
обязательно выглядит как выражение для меня, но код выполняется без ошибок.
Ответы
Ответ 1
В документации указано, что EXEC
может принимать либо строковую переменную, либо константную строку T-SQL, либо комбинации/конкатенации обеих их.
В примере "почему эта работа" используется конкатенация константной строки T-SQL и строковой переменной, и поэтому она совершенно легальна.