【问题标题】:Cursorfetch: The number of variables declared in the INTO list must match that of selected columns in SQL Server 2012Cursorfetch:INTO 列表中声明的变量数量必须与 SQL Server 2012 中选定列的数量相匹配
【发布时间】:2019-10-06 09:49:55
【问题描述】:

我创建了一个存储过程,它验证给定表作为参数的某些列,并决定使用 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

【问题讨论】:

标签: sql-server cursor


【解决方案1】:

试试这个-

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

【讨论】:

  • 当网站上已经存在答案时,最好将其标记为重复而不是回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多