I want to execute the following T-SQL dynamic statement:
CREATE PROCEDURE MergeTable @TableName NVARCHAR(max)
AS BEGIN
DECLARE @MergeStatement NVARCHAR(max)
SET @MergeStatement = 'SELECT Query FROM dbo.QueryMergeDWH WHERE SourceTableName = ' + @TableName
EXEC sp_executesql @MergeStatement
END
EXEC MergeTable @TableName = 'SGPREINVOICE'
However, this gives me the following error:
Msg 207, Level 16, State 1, Line 17 Invalid column name 'SGPREINVOICE'.
This actually works:
SELECT 'SELECT Query FROM dbo.QueryMergeDWH WHERE SourceTableName = ' + 'SGPREINVOICE'
What am I doing wrong here?
LOGIN/USERwith high enough permissions they could literally do anything they wanted with minimal effort. NEVER inject unsanitised strings into a dynamic statement and don't useMAXfor an object's name. There is a specific data type for object names:sysname.SET @MergeStatement = N'SELECT Query FROM dbo.QueryMergeDWH WHERE SourceTableName = @TableName';EXEC sp_executesql @MergeStatement, N'@TableName nvarchar(523)', @TableName = @TableName;;