SQL Server存储过程:如何用参数指定永久目标表名?
解决SQL Server存储过程动态表名问题
你的问题出在静态SQL无法直接用变量作为对象名称,SQL Server会把@TableName当作字面量表名,而不是读取变量传入的值。要实现动态创建指定名称的表,需要使用动态SQL,同时注意避免SQL注入和合法标识符处理。
修正后的存储过程代码
CREATE PROCEDURE DUALTYPE @TableName nvarchar(18), @YesNo int AS BEGIN DECLARE @SQL nvarchar(MAX); -- 用QUOTENAME处理表名,确保标识符合法,防止SQL注入 SET @SQL = N'SELECT * INTO dbo.' + QUOTENAME(@TableName) + N' FROM (SELECT * FROM mytable WHERE dual = @YesNo) dualtab'; -- 使用sp_executesql执行动态SQL,参数化@YesNo避免注入 EXEC sp_executesql @SQL, N'@YesNo int', @YesNo = @YesNo; END
执行存储过程(注意参数间的逗号)
EXEC DUALTYPE @TableName = 'dualtable', @YesNo = 0
关键说明
QUOTENAME(@TableName):自动给表名添加方括号,处理表名包含特殊字符、关键字或空格的情况,同时防止SQL注入。sp_executesql:相比直接用EXEC执行拼接字符串,它支持参数化传递变量(比如@YesNo),既避免注入风险,又能重用执行计划提升性能。
内容的提问来源于stack exchange,提问作者llsabang
相关产品推荐
相关产品推荐

