Почему конкатенация строк в аргументе 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 и строковой переменной, и поэтому она совершенно легальна.