Sql 带存储过程问题的游标
我需要使用一个游标来调用一个存储过程,该存储过程有两个参数需要从Customers表传入 这就是我的意思 我的目标是将Customers表中的所有CustomerID和CustomerName传递到名为AddCustomers的存储过程中,该存储过程有两个参数CustomerID和CustomerName。 ie:AddCustomer[CustomerID],[CustomerName] [旁注:此AddCustomer存储过程执行我的应用程序所需的一些筛选操作] 因此,将此游标与存储过程一起使用的最终结果是将customerID和CustomerName从Customers表转储/传递到AddCustomer存储过程中 我已经使用了sp_executesql,但没有成功 这是我尝试过但不起作用的东西Sql 带存储过程问题的游标,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我需要使用一个游标来调用一个存储过程,该存储过程有两个参数需要从Customers表传入 这就是我的意思 我的目标是将Customers表中的所有CustomerID和CustomerName传递到名为AddCustomers的存储过程中,该存储过程有两个参数CustomerID和CustomerName。 ie:AddCustomer[CustomerID],[CustomerName] [旁注:此AddCustomer存储过程执行我的应用程序所需的一些筛选操作] 因此,将此游标与存储过程一起
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变量上使用了错误的类型。我不记得确切的错误消息,但它与表有关。