1

I am trying to execute the dynamic SQL from SQL Server while loop. When the only print statement is executed query prints in the correct format but does not execute dynamic SQL with execute() or SP_EXECUTESQL. Please suggest. Code:

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 Answers 2

2

There is an open ' at the end of SET @count= @count, remove that.

Use EXEC (@QueryString) to execute it, so it will look this this:

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;
Sign up to request clarification or add additional context in comments.

Comments

0

-- Dynamic Query closing was not proper SET @count= @count - 1' Repeated twice which is not proper

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.