title: Why does concatenating strings in the argument of EXEC sometimes cause a syntax error in T-SQL?
body: <p>In MS SQL Server Management Studio 2005, running this code</p>
  
  <pre><code>EXEC('SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR))
  </code></pre>
  
  <p>gives this error: <code>Incorrect syntax near 'CAST'</code></p>
  
  <p>However, if I do this, it works:</p>
  
  <pre><code>DECLARE @temp VARCHAR(4000)
  SET @temp = 'SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR)
  EXEC(@temp)
  </code></pre>
  
  <p>I found an explanation here: <a href="https://stackoverflow.com/questions/1044831/t-sql-cannot-pass-concatenated-string-as-argument-to-stored-procedure">T-SQL: Cannot pass concatenated string as argument to stored procedure</a></p>
  
  <p>According to the accepted answer, <code>EXEC</code> can take a local variable or a value as its argument, but not an expression.</p>
  
  <p>However, if that's the case, why does this work:</p>
  
  <pre><code>DECLARE @temp VARCHAR(4000)
  SET @temp = CAST(3 AS VARCHAR)
  EXEC('SELECT * FROM employees WHERE employeeID = ' + @temp)
  </code></pre>
  
  <p><code>'SELECT * FROM employees WHERE employeeID = ' + @temp</code> sure looks like an expression to me, but the code executes with no errors.</p>