2017-09-04 88 views
1

我想從SQL Server while循環執行動態SQL。當執行唯一的打印語句時,將以正確格式查詢打印,但不會使用​​或SP_EXECUTESQL執行動態SQL。請建議。 代碼:SQL Server While循環和動態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 

END

回答

2

有一個開放的'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; 
0

- 動態查詢閉不正確的SET @數= @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