SQL Server变量的细微之处

Moo*_*ght 3 t-sql variables stored-procedures sql-server-2008-r2

我有以下SQL Server存储过程:

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
IF EXISTS (SELECT name 
           FROM sys.tables 
           WHERE name = @TmpTableName) 
DROP TABLE @TmpTableName; -- This will not work.
GO
Run Code Online (Sandbox Code Playgroud)

这显然不起作用(参见上面的snippit中的评论).我发现解决这个问题的唯一(也是非常丑陋的)方法是执行以下操作

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
DECLARE @SQL NVARCHAR(4000) 
SET @SQL = N'IF EXISTS (SELECT name ' +
           N'FROM sys.tables ' + 
           N'WHERE name = N' + N'''' + @TmpTableName + N''') ' + 
           N'DROP TABLE ' + @TmpTableName + N';'
EXEC sp_executesql @SQL;
GO
Run Code Online (Sandbox Code Playgroud)

真正发臭和大型存储过程,这是可怕的!

还有另一种我不知道的做法吗?

谢谢你的时间.

Ada*_*Dev 6

不,如果要像这样动态使用表名,则需要使用动态SQL.

所以你应该确保你没有打开令人讨厌的SQL注入风险!

尝试这样的事情:

SET @SQL = 'IF EXISTS (SELECT name ' +
           N'FROM sys.tables ' + 
           N'WHERE name = @TableName) ' + 
           N'DROP TABLE ' + QUOTENAME(@TmpTableName) + ';'

EXEC sp_executesql @SQL, N'@TableName sysname', @TmpTableName;
Run Code Online (Sandbox Code Playgroud)