【问题标题】:SQL Server : Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='SQL Server:消息 102,级别 15,状态 1,第 2 行 '=' 附近的语法不正确
【发布时间】:2013-12-12 15:28:17
【问题描述】:

我正在编写一个存储过程,并将表名作为参数传递,但这部分出现错误:

DECLARE 
@TableA nvarchar(255)='TableA',
@DOCID1 nvarchar(MAX),
@DOCID2 int;

EXEC ('
SELECT TOP (1) '+ @DOCID1 +'=DOCID1,'+ @DOCID2 +'=DOCID2
FROM [' + @TABLEA + ']
ORDER BY DOCID2')

运行此查询后,我收到此错误:

消息 102,第 15 级,状态 1,第 2 行
'=' 附近的语法不正确

我已经尝试过,但我无法确定错误,此时我需要一些帮助..

【问题讨论】:

    标签: sql-server tsql sql-server-2008 dynamic-sql


    【解决方案1】:

    我相信您必须在执行之前将整个 SQL 语句连接在一起:

    DECLARE 
        @TableA nvarchar(255)='TableA',
        @DOCID1 nvarchar(MAX),
        @SqlStmt NVARCHAR(500),
        @DOCID2 int;
    
    SET @SqlStmt = N'SELECT TOP (1) ' + @DOCID1 + N' = DOCID1, ' + @DOCID2 + N' = DOCID2 FROM [' + @TABLEA + N'] ORDER BY DOCID2';
    
    EXEC (@SqlStmt)
    

    据我记得,EXEC 命令中不能有表达式和计算 - 事先准备好语句,然后执行它

    另外,我不完全确定你的这些变量是什么 - @DocID1@DocID2 - 你想设置它们的值,还是它们持有另一个要设置的变量的名称??

    更新:如果你真的想设置 @DocID1@DocID2 的值,那么你的查询一开始就错了 - 那么你需要这样的东西:

    DECLARE 
        @TableA nvarchar(255) = 'TableA',
        @SqlStmt NVARCHAR(500);
    
    SET @SqlStmt = 
        N'DECLARE @DocID1 NVARCHAR(MAX), @DocID2 INT; ' +
        N'SELECT TOP (1) @DOCID1 = DOCID1, @DOCID2 = DOCID2 FROM [' + @TABLEA + N'] ORDER BY DOCID2';
    
    EXEC (@SqlStmt)
    

    但是,这两个变量的作用域是动态执行的 SQL 中,并且对脚本的“外部”不可用。

    【讨论】:

    • 我只想从选择的结果中设置它们的值。
    【解决方案2】:

    什么版本的 SQL Server?语法 -

    DECLARE 
    @TableA nvarchar(255)='TableA'
    

    仅受 SQL Server 2008 支持。对于旧版本,您必须编写:

    DECLARE 
    @TableA nvarchar(255)
    SET @TableA ='TableA'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多