Cursorfetch:INTO 列表中声明的变量数必须与 SQL Server 2012 中选定列的数量相匹配
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns in SQL Server 2012
我创建了一个存储过程,它在给定 table 作为参数的情况下验证某些列,并决定使用 Cursor。但是我在尝试执行存储过程时遇到此游标提取错误。
我已经仔细检查了列,它与 INTO 列表中的变量数相匹配。我尝试通过编写此
来修改存储过程
SELECT Lot, ItemId, PO, Status, ErrorDetails
FROM Table1
而不是
SELECT @SQLSTATEMENT
在
之后
SET @MyCursor = CURSOR FOR
而且效果很好。但我希望源 table 成为参数,所以这对我不起作用。有什么想法吗?
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
试试这个-
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
我创建了一个存储过程,它在给定 table 作为参数的情况下验证某些列,并决定使用 Cursor。但是我在尝试执行存储过程时遇到此游标提取错误。
我已经仔细检查了列,它与 INTO 列表中的变量数相匹配。我尝试通过编写此
来修改存储过程SELECT Lot, ItemId, PO, Status, ErrorDetails
FROM Table1
而不是
SELECT @SQLSTATEMENT
在
之后SET @MyCursor = CURSOR FOR
而且效果很好。但我希望源 table 成为参数,所以这对我不起作用。有什么想法吗?
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
试试这个-
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