【问题标题】:SQL Server while loop and dynamic SQLSQL Server while 循环和动态 SQL
【发布时间】:2018-02-12 08:51:36
【问题描述】:

我正在尝试从 SQL Server while 循环执行动态 SQL。当执行唯一的打印语句时,查询以正确的格式打印,但不使用execute()SP_EXECUTESQL 执行动态SQL。请建议。 代码:

WHILE( @count > 0 )
BEGIN 
    SELECT 
        @minID = MinID,
        @maxID = MaxID
    FROM
        IDRange
    WHERE
        ID = @count

    SET @QueryString = ' UPDATE 
                        SD  WITH(TABLOCk)
                            SET a = S4H.ID
                        FROM 
                            A (nolock) S4H
                            INNER JOIN B SD on S4H.col = SD.col AND S4H.col1 = SD.col1
                        WHERE 
                            SD.ID between ' + convert (varchar,@minID )+' AND '+convert (varchar,@maxID )+' AND
                            S4H.ID <= SD.ID AND 
                            SD.ID <= S4h.ROWID' 
                            SET @count= @count - 1' 
    print @QueryString
    EXECUTE (@QueryString)
    EXECUTE sp_executesql @QueryString, N'@minID INT,@maxID INT', @minID = @minID,@maxID= @maxID
    --EXEC SP_EXECUTESQL @QueryString
    --SELECT @Rcount= @@Rowcount

    SET @count= @count - 1
END

结束

【问题讨论】:

    标签: sql sql-server dynamic while-loop


    【解决方案1】:

    SET @count= @count 末尾有一个开放的',删除它。

    使用EXEC (@QueryString) 执行它,所以它看起来像这样:

    WHILE(@count > 0)
        BEGIN
            SELECT
                @minID = MinID,
                @maxID = MaxID
            FROM IDRange
            WHERE ID = @count;
            SET @QueryString = ' UPDATE 
                            SD  WITH(TABLOCk)
                                SET a = S4H.ID
                            FROM 
                                A (nolock) S4H
                                INNER JOIN B SD on S4H.col = SD.col AND S4H.col1 = SD.col1
                            WHERE 
                                SD.ID between '+CONVERT(VARCHAR, @minID)+' AND '+CONVERT(VARCHAR, @maxID)+' AND
                                S4H.ID <= SD.ID AND 
                                SD.ID <= S4h.ROWID';
            PRINT @QueryString;
            EXEC (@QueryString);
    
            SET @count = @count - 1;
        END;
    

    【讨论】:

      【解决方案2】:

      -- 动态查询关闭不正确 SET @count= @count - 1' 重复两次不正确

      WHILE( @count > 0 )
      BEGIN 
      
          SELECT @minID = MinID, @maxID = MaxID
          FROM  IDRange
          WHERE ID = @count
      
          SET @QueryString = ' UPDATE 
                              SD  WITH(TABLOCk)
                                  SET a = S4H.ID
                              FROM 
                                  A (nolock) S4H
                                  INNER JOIN B SD on S4H.col = SD.col AND S4H.col1 = SD.col1
                              WHERE 
                                  SD.ID BETWEEN ' + convert (varchar,@minID )+' AND '+convert (varchar,@maxID )+' AND
                                  S4H.ID <= SD.ID AND 
                                  SD.ID <= S4h.ROWID' 
      
          PRINT    @QueryString
          EXECUTE (@QueryString)
          SET @count= @count - 1
      END
      

      【讨论】:

        猜你喜欢
        • 2020-03-01
        • 2018-10-28
        • 2018-10-07
        • 1970-01-01
        • 2014-02-10
        • 2018-06-20
        • 2021-03-23
        • 2013-07-12
        • 2013-08-29
        相关资源
        最近更新 更多