2017-09-04 2 views
1

J'essaie d'exécuter le SQL dynamique à partir de SQL Server en boucle. Lorsque la seule instruction d'impression est exécutée, la requête s'imprime dans le format correct, mais n'exécute pas le code SQL dynamique avec execute() ou SP_EXECUTESQL. Veuillez suggérer. code:SQL Server en boucle et SQL dynamique

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 

FIN

Répondre

2

Il y a un ' ouvert à la fin de SET @count= @count, enlever cela.

Utilisez EXEC (@QueryString) pour l'exécuter, il regardera ce ceci:

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

- Fermeture requête dynamique n'a pas été comptage SET @ correct = @count - 1' répétée deux fois, ce n'est pas bon

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