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
作为游标查询的一部分及其结果:如果没有其他混淆,