2017-09-04 18 views
1

ループ中にSQL Serverから動的SQLを実行しようとしています。唯一のprint文が実行されると、正しい形式で照会されますが、​​またはSP_EXECUTESQLの動的SQLは実行されません。提案してください。 コード:ループおよび動的SQLの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 
関連する問題