You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:57:22