【问题标题】:How to pass a table variable using sp_executesql如何使用 sp_executesql 传递表变量
【发布时间】:2013-12-08 00:00:09
【问题描述】:

我正在尝试使用 sp_executesql 创建一个表,但我不断收到一条错误消息,提示“'@_TableName' 附近的语法不正确。知道我在这里做错了什么吗?

这是我正在使用的代码:

DECLARE @SQLString NVARCHAR(MAX), 
        @ParamDefinition NVARCHAR(MAX), 
        @TableName NVARCHAR(MAX);

SET @TableName  = N'[dbo].[MyTable]';

SET @SQLString = N'SELECT * FROM @_TableName;';

SET @ParamDefinition = N'@_TableName NVARCHAR(max)';

EXEC sp_executesql @SQLString, @ParamDefinition, 
                   @_TableName = @TableName;

这会产生错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '@_TableName'.

如果我对表名和列类型进行硬编码(我必须两者都做),那么查询就可以工作,否则我会得到这两个变量的错误语法消息。

如果你想知道,我想把这段代码放在一个存储过程中,这样如果有人想创建或修改一个表,他们就会调用这个可以运行额外验证的存储过程。

【问题讨论】:

    标签: sql sql-server dynamic-sql sp-executesql


    【解决方案1】:

    找出问题所在。

    显然 sp_executesql 期望表的参数定义为表类型(请参阅此答案以获取示例:https://stackoverflow.com/a/4264553/21539)。

    解决此问题的更简单方法是将变量名称直接插入 SQLStatement 字符串,如下所示:

    DECLARE @SQLString NVARCHAR(MAX), 
            @TableName NVARCHAR(MAX);
    
    SET @TableName  = N'[dbo].[MyTable]';
    
    SET @SQLString = N'SELECT * FROM ' + @TableName + ';';
    
    SET @ParamDefinition = N'@_TableName NVARCHAR(max);
    
    EXEC sp_executesql @SQLString;
    

    【讨论】:

    • 不幸的是,如果@TableName 来自用户输入,这会使您容易受到 SQL 注入攻击。这个答案解释了如何解决这个问题:stackoverflow.com/a/1246848/109122
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2020-12-20
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多