Cursorfetch: количество переменных, объявленных в списке INTO, должно соответствовать количеству выбранных столбцов в SQL Server 2012 - PullRequest
0 голосов
/ 20 мая 2019

Я создал хранимую процедуру, которая проверяет определенные столбцы, учитывая таблицу в качестве параметра, и решил использовать Cursor. Но я получаю эту ошибку при извлечении курсора при попытке выполнить хранимую процедуру.

Я уже дважды проверил столбцы, и это соответствует количеству переменных в списке INTO. Я попытался изменить хранимую процедуру, написав это

SELECT Lot, ItemId, PO, Status, ErrorDetails 
FROM Table1

вместо

SELECT @SQLSTATEMENT

после

SET @MyCursor = CURSOR FOR 

и работает нормально. Но я хочу, чтобы исходная таблица была параметром, поэтому у меня это не сработает. Есть идеи?

CREATE PROCEDURE [dbo].[ValidateData]
    @TABLENAME_PARAM NVARCHAR(100)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @MyCursor CURSOR;
    DECLARE @CustomerLot  NVARCHAR(100),
            @DeviceName   NVARCHAR(100),
            @PO           NVARCHAR(100),
            @Status       NVARCHAR(1),
            @ErrorDetails NVARCHAR(250);
    DECLARE @TABLENAME  NVARCHAR(100);
    DECLARE @SQLSTATEMENT AS NVARCHAR(MAX);

    SELECT @TABLENAME = Quotename (TABLE_NAME)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @TABLENAME_PARAM

    SET @SQLSTATEMENT = 'Select Lot, ItemId, PO, Status, ErrorDetails FROM ' + @TABLENAME + ' WHERE  Status = ''N'''

    BEGIN
        SET @MyCursor = CURSOR FOR 
            SELECT @SQLSTATEMENT

        OPEN @MyCursor

        FETCH NEXT FROM @MyCursor INTO @CustomerLot, @DeviceName, @PO, @Status, @ErrorDetails

        WHILE @@FETCH_STATUS = 0
        BEGIN
            BEGIN TRAN
                --some validations here
                COMMIT TRAN

                FETCH NEXT FROM @MyCursor INTO @CustomerLot, @DeviceName, @PO, @Status, @ErrorDetails
        END;

        CLOSE @MyCursor;
        DEALLOCATE @MyCursor;
    END
END
GO

1 Ответ

0 голосов
/ 20 мая 2019

Попробуйте это-

CREATE PROCEDURE [dbo].[ValidateData] @TABLENAME_PARAM NVARCHAR(100)
AS
BEGIN
    SET NOCOUNT ON;

    --DECLARE @MyCursor CURSOR;
    DECLARE 
            @CustomerLot  NVARCHAR(100),
            @DeviceName   NVARCHAR(100),
            @PO           NVARCHAR(100),
            @Status       NVARCHAR(1),
            @ErrorDetails NVARCHAR(250);
    DECLARE @TABLENAME  NVARCHAR(100);
    DECLARE @SQLSTATEMENT AS NVARCHAR(MAX);

    SELECT @TABLENAME = Quotename (TABLE_NAME)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @TABLENAME_PARAM

    SET @SQLSTATEMENT = 'DECLARE  MyCursor CURSOR FOR Select Lot, ItemId, PO, Status, ErrorDetails FROM ' + @TABLENAME + ' WHERE  Status = ''N'''
    EXEC sp_executesql @sqlstatement
    OPEN MyCursor

    FETCH NEXT FROM MyCursor INTO @CustomerLot, @DeviceName, @PO, @Status, @ErrorDetails

    WHILE @@FETCH_STATUS = 0
        BEGIN
            BEGIN TRAN
            --some validations here
            COMMIT TRAN

            FETCH NEXT FROM MyCursor INTO @CustomerLot, @DeviceName, @PO, @Status, @ErrorDetails
        END;

        CLOSE MyCursor;
        DEALLOCATE MyCursor
    END
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...