Sql 带存储过程问题的游标

Sql 带存储过程问题的游标,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我需要使用一个游标来调用一个存储过程,该存储过程有两个参数需要从Customers表传入 这就是我的意思 我的目标是将Customers表中的所有CustomerID和CustomerName传递到名为AddCustomers的存储过程中,该存储过程有两个参数CustomerID和CustomerName。 ie:AddCustomer[CustomerID],[CustomerName] [旁注:此AddCustomer存储过程执行我的应用程序所需的一些筛选操作] 因此,将此游标与存储过程一起

我需要使用一个游标来调用一个存储过程,该存储过程有两个参数需要从Customers表传入

这就是我的意思

我的目标是将Customers表中的所有CustomerID和CustomerName传递到名为AddCustomers的存储过程中,该存储过程有两个参数CustomerID和CustomerName。 ie:AddCustomer[CustomerID],[CustomerName] [旁注:此AddCustomer存储过程执行我的应用程序所需的一些筛选操作]

因此,将此游标与存储过程一起使用的最终结果是将customerID和CustomerName从Customers表转储/传递到AddCustomer存储过程中

我已经使用了sp_executesql,但没有成功

这是我尝试过但不起作用的东西

Declare @CustomerID int
Declare @CustomerName varchar(100)

Declare cur CURSOR READ_ONLY
FOR
SELECT CustomerID, CustomerName
from Customers

OPEN cur

FETCH NEXT FROM cur
INTO @CustomerID, @CustomerName

WHILE @@FETCH_STATUS = 0
BEGIN
   EXEC AddCustomer @CustomerID, @CustomerName 
   FETCH NEXT FROM cur
   INTO @CustomerID, @CustomerName
END

CLOSE cur
DEALLOCATE cur

我对游标的使用还不熟悉,所以我不确定这为什么不起作用。如果你能提供任何线索或链接,我将不胜感激

更新: 好的,若游标不能循环通过存储过程,那个么任何人都可以为我的问题提供解决方案或提示,即从Customers表传递所有CustomerID和CustomerName吗
进入我的AddCustomer存储过程,这样我就可以对传入AddCustomer存储过程的每个CustomerID和CustomerName执行一些过滤操作。

为什么要使用光标?你是否意识到这是解决这个问题效率最低、最复杂的方法?使用经过修改的存储过程版本,您会有更好的机会。或者其他几种模式中的一种


同样,最简单的方法可能是修改输入的存储过程(如果需要,创建一个新的存储过程)

或者,您可以使用您选择的语言(C#、VB等)为客户查询,并在存储过程中循环


您打算如何处理异常,否则/

从语法的角度看,您的游标很好。我猜这个问题与您的存储过程抛出错误有关。您还应该发布存储过程的代码

以及错误消息。

Sam

有时,使用存储过程执行这样的任务是非常合适的。勒多费尔当然给了我很多好的建议,但在这一点上我不能同意他的观点。特别是如果这是一次性处理您的记录以实现某种形式的转换,那么您就非常接近您的解决方案,因为我看不到您的代码中有任何明显的缺陷。顺便说一句,我不止一次采用了相同的方法,效果非常好

所以…发布存储过程,我们将看看这是否有帮助。另外,您看到的具体错误是什么

更新:等等,您只是在SQL窗口中运行这个吗?我通常将这些东西打包到另一个存储过程(通常只是一个临时存储过程)中,然后运行它。当然,也可能是您只需要执行这段代码——不是使用EXEC,而是使用execute按钮……根据您的描述很难判断


更新2:您在上面说错误与表有关。您确定您定义的数据类型正确吗?错误是否可能是从表中提取的数据与您将其放入的var类型不匹配?

语法似乎没有任何错误。我们确实需要错误消息来提供答案

由于失明,我最好的选择是varchar(100)。。。也许桌子上有它


语法似乎没有任何问题。我们确实需要错误消息来提供答案

由于失明,我最好的选择是varchar(100)。。。也许桌子上有它

更新1:k,你在评论中提到过


“数据类型应相同。I 我花了时间来检查它。 他们的身份不明 用于的CustoemrID和varchar “客户名称”

注意,您在customerid变量上使用int。
将其更改为:Declare@CustomerID uniqueidentifier

这是必需的。所以我别无选择,事实上不是这样。不能像UDF那样以基于集合的方式调用存储过程。为什么?我无法想象一个合理的建议,除非我能想象一个可以合理解决的问题。你确定吗?因此,不可能使用游标在存储过程中循环?Le Dorfier,正在发生的事情是,我需要使用客户的所有CsutomerID和CustomerName重新填充一个名为CustomerFilter from Customers表的表。我只想写一个脚本,用我现有的AddCustomers SP自动将数据从客户转储到CustomerFilter。我认为我上面写的SQL是不对的。为了回答您的问题,AddCustomer存储过程只需向名为CustomerFilter的表中添加一行。ie:addCustomer1,'johndoe'在上面调用它只会在CustomerFilter表中添加一行。没什么特别的。然后只需“从客户中选择CustomerID、CustomerName到CustomerFilter”。或者“插入CustomerFilter(CustomerId,CustomerName)从Customers中选择CustomerId,CustomerName”并不是那么简单。正如我前面所说,AddCustomer存储过程正在CustomerName上进行一些过滤。因此,当完成执行此SP时,名称将不同于Customers表中的原始CustomerName。我要传达我的信息吗?我只需要创建一个脚本,使用名为AddCustomer的存储过程自动将所有customerId和CustomerName传递到另一个表中。我如何执行它并不重要。数据类型应该是相同的。我花了时间检查了一下。CustoemrID和customerNameSam的varchar是无法识别的,正如我在回答中所显示的,您在customerid变量上使用了错误的类型。我不记得确切的错误消息,但它与表有关。