admin

带有存储过程问题的游标

sql

我需要使用游标来调用具有2个参数的存储过程,我需要将这些参数从“客户”表中传入。

这就是我的意思;

我的目标是将“客户”表中的所有“客户ID”和“客户名称”传递到名为AddCustomers的存储过程中,该存储过程具有“客户ID”和“客户名称”两个参数。即:AddCustomer
[CustomerID],[CustomerName] [附带说明:此AddCustomer存储过程对我的应用程序进行了一些过滤操作]

因此,将此CURSOR与存储过程一起使用的最终结果是将“客户”表中的所有customerID和CustomerName都转储/通过到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无法通过存储过程循环,那么任何人都可以提供解决方案或提示我的问题,即将所有来自Customer表的CustomerID和CustomerName传递到我的AddCustomer存储过程中,以便我可以对每个我传递给AddCustomer存储过程的CustomerID和CustomerName。


阅读 139

收藏
2021-06-07

共1个答案

admin

山姆

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

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

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

更新2: 您在上面说错误是关于表的问题。您确定所定义的数据类型正确吗?该错误可能是从表中提取的数据与您要放置的var类型之间的不匹配吗?

2021-06-07