存储过程问题的游标

时间:2009-02-21 00:46:13

标签: sql sql-server stored-procedures

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

这就是我的意思;

我的目标是将Customers表中的所有CustomerID和CustomerName传递给名为AddCustomers的存储过程,该存储过程具有2个CustomerID和CustomerName参数。 即:AddCustomer [CustomerID],[CustomerName] [旁注:这个AddCustomer存储过程会对我的应用程序进行一些过滤操作]

因此,将此CURSOR与存储过程一起使用的最终结果是将所有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

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

更新

好吧,如果Cursor不能通过存储过程循环,那么任何人都可以提供我的问题的解决方案或提示,即从Customers表中传递所有CustomerID和CustomerName 进入我的AddCustomer存储过程,以便我可以对传递给AddCustomer存储过程的每个CustomerID和CustomerName进行一些过滤。

4 个答案:

答案 0 :(得分:1)

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

错误信息。

答案 1 :(得分:1)

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

失明我最好的镜头就是varchar(100)...也许桌子上有nvarchar ......

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

失明我最好的镜头就是varchar(100)...也许桌子上有nvarchar ......

更新1: k,您在评论中提及

  

“数据类型应该相同。我   花时间去研究它。   他们是独特的标识符   CustoemrID和varchar for   客户名称“

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

答案 2 :(得分:0)

为什么使用光标?您是否意识到这是解决此问题的最低效,最复杂的方法?使用存储过程的修改版本可以获得更好的机会。或者是其他几种模式之一。


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

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

你打算如何处理异常/

答案 3 :(得分:0)

山姆,

有时使用存储过程来完成这样的任务非常合适。 Le Dorfier当然给了我许多好的建议,但我不得不在这方面不同意。特别是如果这是一次性处理您的记录以实现某种形式的转换,那么您真的接近您的解决方案,因为我没有在您的代码中看到任何明显的缺陷。顺便说一句,我不止一次采取同样的方法,而且效果很好。

所以......发布存储过程以及我们会看到这是否有帮助。另外,你看到了什么具体的错误?

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

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