Sql server 存储过程中的T-SQL游标

Sql server 存储过程中的T-SQL游标,sql-server,stored-procedures,cursor,Sql Server,Stored Procedures,Cursor,我正在使用一个存储过程,我想使用游标插入新数据(如果存在数据,我想更新) 我的表名为tblGatewayConnection包含以下列: resellerID gwResellerID userName password url serviceType serviceDesc feedFromMain publicKey 当我使用存储过程插入数据时,我得到一个异常 Cursorfetch:INTO列表中声明的变量数必须与所选列的变量数匹配 我错过了什么 任何帮助都将不胜感激 谢谢。为什么还要用

我正在使用一个存储过程,我想使用游标插入新数据(如果存在数据,我想更新)

我的表名为
tblGatewayConnection
包含以下列:

resellerID
gwResellerID
userName
password
url
serviceType
serviceDesc
feedFromMain
publicKey
当我使用存储过程插入数据时,我得到一个异常

Cursorfetch:INTO列表中声明的变量数必须与所选列的变量数匹配

我错过了什么

任何帮助都将不胜感激


谢谢。

为什么还要用光标呢?!?!?!?!?我不会告诉您光标出了什么问题-因为您首先应该学习避免它,而不是修复光标

严肃地说-尽可能避免进行RBAR(逐行处理)处理,在这里,使用光标真的毫无意义-只需使用这个漂亮干净的基于集合的语句:

ALTER PROCEDURE [dbo].[conn] @ResellerID   INT,
                             @GWResellerID INT,
                             @UserName     VARCHAR(50),
                             @Password     VARCHAR(50),
                             @URL          VARCHAR(100),
                             @ServiceType  INT,
                             @ServiceDesc  VARCHAR(50),
                             @FeedFrom     BIT,
                             @PublicKey    VARCHAR(max)
AS
    INSERT INTO dbo.tblGatewayConnection
                (ResellerID, GWResellerID, UserName, Password,
                 URL, ServiceType, ServiceDesc, feedFromMain,
                 publicKey)
       SELECT 
          ResellerID, GWResellerID, UserName, Password,
          URL, ServiceType, ServiceDesc, feedFromMain,
          publicKey
       FROM   
          dbo.reseller_profiles
       WHERE  
          main_reseller_ID = @ResellerID 

你完了!!没有凌乱的光标,没有不必要的局部变量-只是一个简单的
插入。。。选择
,您就实现了您想要的

为什么还要用光标呢?!?!?!?!?我不会告诉您光标出了什么问题-因为您首先应该学习避免它,而不是修复光标

严肃地说-尽可能避免进行RBAR(逐行处理)处理,在这里,使用光标真的毫无意义-只需使用这个漂亮干净的基于集合的语句:

ALTER PROCEDURE [dbo].[conn] @ResellerID   INT,
                             @GWResellerID INT,
                             @UserName     VARCHAR(50),
                             @Password     VARCHAR(50),
                             @URL          VARCHAR(100),
                             @ServiceType  INT,
                             @ServiceDesc  VARCHAR(50),
                             @FeedFrom     BIT,
                             @PublicKey    VARCHAR(max)
AS
    INSERT INTO dbo.tblGatewayConnection
                (ResellerID, GWResellerID, UserName, Password,
                 URL, ServiceType, ServiceDesc, feedFromMain,
                 publicKey)
       SELECT 
          ResellerID, GWResellerID, UserName, Password,
          URL, ServiceType, ServiceDesc, feedFromMain,
          publicKey
       FROM   
          dbo.reseller_profiles
       WHERE  
          main_reseller_ID = @ResellerID 

你完了!!没有凌乱的光标,没有不必要的局部变量-只是一个简单的
插入。。。选择
,您就实现了您想要的

我不确定该错误消息是否更容易解释:

Cursorfetch:INTO列表中声明的变量数必须与所选列的变量数匹配

您正在选择all来自
reseller\u profiles

declare gateway cursor for
     select * 
     from reseller_profiles 
     where main_reseller_ID = @ResellerID
并尝试将它们放入单个变量中:

FETCH NEXT FROM gateway INTO @ResellerID
在光标中选择的列数必须与插入的变量数相匹配,因此需要

declare gateway cursor for
     select reseller_id
     from reseller_profiles 
     where main_reseller_ID = @ResellerID
但是您不应该为此使用光标,您可以使用
INSERT。。选择

INSERT INTO [dbo].tblGatewayConnection
(   [ResellerID],[GWResellerID], [UserName], [Password], [URL], 
    [ServiceType], [ServiceDesc],[feedFromMain], publicKey
)
SELECT  Resellerid, @GWResellerID, @UserName, @Password, 
        @URL, @ServiceType, @ServiceDesc, @FeedFrom, @PublicKey
FROM    reseller_profiles 
WHERE   main_reseller_ID = @ResellerID;
如前所述,您应该不惜一切代价避免使用游标,如果您必须使用游标,请声明最轻的游标。例如,在您的示例中,您只在光标内向前移动,只读取数据,不修改数据,并且只在本地访问光标,因此您将按如下方式声明光标:

DECLARE gateway CURSOR LOCAL STATIC FAST_FORWARD
FOR
    SELECT  ...
    FROM ..
尽管游标在最好的时候表现得很糟糕,但由于懒惰的声明,它们的名声更差


最后,

我不确定该错误消息是否可以更清楚地解释:

Cursorfetch:INTO列表中声明的变量数必须与所选列的变量数匹配

您正在选择all来自
reseller\u profiles

declare gateway cursor for
     select * 
     from reseller_profiles 
     where main_reseller_ID = @ResellerID
并尝试将它们放入单个变量中:

FETCH NEXT FROM gateway INTO @ResellerID
在光标中选择的列数必须与插入的变量数相匹配,因此需要

declare gateway cursor for
     select reseller_id
     from reseller_profiles 
     where main_reseller_ID = @ResellerID
但是您不应该为此使用光标,您可以使用
INSERT。。选择

INSERT INTO [dbo].tblGatewayConnection
(   [ResellerID],[GWResellerID], [UserName], [Password], [URL], 
    [ServiceType], [ServiceDesc],[feedFromMain], publicKey
)
SELECT  Resellerid, @GWResellerID, @UserName, @Password, 
        @URL, @ServiceType, @ServiceDesc, @FeedFrom, @PublicKey
FROM    reseller_profiles 
WHERE   main_reseller_ID = @ResellerID;
如前所述,您应该不惜一切代价避免使用游标,如果您必须使用游标,请声明最轻的游标。例如,在您的示例中,您只在光标内向前移动,只读取数据,不修改数据,并且只在本地访问光标,因此您将按如下方式声明光标:

DECLARE gateway CURSOR LOCAL STATIC FAST_FORWARD
FOR
    SELECT  ...
    FROM ..
尽管游标在最好的时候表现得很糟糕,但由于懒惰的声明,它们的名声更差


最后,

第一:为什么你坚持用光标来做这件事??尽可能避免RBAR(一行接一行)处理!!不要在生产代码中使用
select*from…
。很可能您从查询中获得了多个列;但是您在
to
子句中只提供了一个变量,您还使用
@ResellerID
作为游标查询的一部分及其结果:如果没有其他令人困惑的地方,首先:为什么您坚持使用游标执行此操作??尽可能避免RBAR(一行接一行)处理!!不要在生产代码中使用
select*from…
。很可能您从查询中获得了多个列;但是您只在
into
子句中提供了一个变量,您还使用
@resllerierid
作为游标查询的一部分及其结果:如果没有其他混淆,