我需要使用游标来调用一个存储过程,该存储过程有两个我需要从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进行一些过滤。
答案 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的类型不匹配吗?