Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does concatenating strings in the argument of EXEC sometimes cause a syntax error in T-SQL?

In MS SQL Server Management Studio 2005, running this code

EXEC('SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR))

gives this error: Incorrect syntax near 'CAST'

However, if I do this, it works:

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

I found an explanation here: T-SQL: Cannot pass concatenated string as argument to stored procedure

According to the accepted answer, EXEC can take a local variable or a value as its argument, but not an expression.

However, if that's the case, why does this work:

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

'SELECT * FROM employees WHERE employeeID = ' + @temp sure looks like an expression to me, but the code executes with no errors.

like image 593
Tim Goodman Avatar asked Apr 15 '10 15:04

Tim Goodman


People also ask

What happens when concatenating strings?

Concatenation is the process of appending one string to the end of another string. You concatenate strings by using the + operator. For string literals and string constants, concatenation occurs at compile time; no run-time concatenation occurs.

Is string concatenation bad?

Due to this, mixing the StringBuilder and + method of concatenation is considered bad practice. Additionally, String concatenation using the + operator within a loop should be avoided. Since the String object is immutable, each call for concatenation will result in a new String object being created.

What is concatenation in SQL?

CONCAT takes a variable number of string arguments and concatenates (or joins) them into a single string. It requires a minimum of two input values; otherwise, CONCAT will raise an error. CONCAT implicitly converts all arguments to string types before concatenation.


1 Answers

The documentation states that EXEC can take either a string variable, a constant T-SQL string, or combinations/concatenations of both of them.

Your "why does this work" example uses a concatenation of a constant T-SQL string and a string variable, and so is perfectly legal.

like image 139
LukeH Avatar answered Oct 09 '22 17:10

LukeH