2017-09-04 1 views
1

SQL Server에서 동적 SQL을 실행하는 동안 루프를 실행하려고합니다. 유일한 print 문이 실행될 때 쿼리는 올바른 형식으로 인쇄하지만 execute() 또는 SP_EXECUTESQL으로 동적 SQL을 실행하지 않습니다. 제발 제안 해주세요. 코드 :루프 및 동적 SQL while 서버

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 SET @count= @count의 말에 오픈 '이 있습니다

답변

2

, 즉를 제거합니다.

사용 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 - 적절한 아닌 두 번 반복 한 '

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