【问题标题】:Cursor with Stored Procedure Question带有存储过程问题的光标
【发布时间】:2009-02-21 00:46:12
【问题描述】:

我需要使用游标来调用一个存储过程,该存储过程有 2 个参数需要从客户表中传入。

这就是我的意思;

我的目标是将客户表中的所有 CustomerID 和 CustomerName 传递到我的名为 AddCustomers 的存储过程中,该过程具有 CustomerID 和 CustomerName 2 个参数。 即:AddCustomer [CustomerID],[CustomerName] [旁注:这个 AddCustomer 存储过程做了一些我的应用程序需要的过滤操作]

因此,将此 CURSOR 与存储过程一起使用的最终结果是将客户表中的所有 customerID 和 CustomerName DUMP/PASS 到 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

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

更新:

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

【问题讨论】:

  • 我不记得确切的错误信息,但它与表格有关。我严重认为我上面的脚本不正确,因为它没有将 CustomerID 和 CustomerName 传递到我的光标循环中。

标签: sql sql-server stored-procedures


【解决方案1】:

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

以及错误消息。

【讨论】:

  • 我觉得我上面写的SQL不对。要回答您的问题,AddCustomer 存储过程只需向名为 CustomerFilter 的表中添加一行。即:AddCustomer 1, 'John Doe' 在上面调用它只会在 CustomerFilter 表中添加一行。没什么特别的。
  • 然后只需“从客户中选择客户 ID、客户名称到客户过滤器”。或“INSERT INTO CustomerFilter (CustomerId, CustomerName) SELECT CustomerId, CustomerName FROM Customers”
  • 事情没那么简单。正如我之前所说,AddCustomer Stored Proc 正在对 CustomerName 进行一些过滤。因此,当执行完这个 SP 后,Name 将与 Customers 表中的原始 CustomerName 不同。我的信息传达了吗?
【解决方案2】:

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

失明我最好的选择是 varchar(100) ...也许桌子上有它 nvarchar ...

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

失明我最好的选择是 varchar(100) ...也许桌子上有它 nvarchar ...

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

"数据类型应该相同。我 已经花时间检查它。 它们是 uniquInde​​ntifier 客户 ID 和 varchar 用于 客户姓名”

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

【讨论】:

  • 我已更改为 uniqueIdentifier,它是一样的。当我输入这个时,这是一个错字。
  • 在您可以在线查看详细信息之前,我们无能为力。也许从一个脚本开始,为变量分配测试值并使用相同的语法和参数执行 SP,但不在游标循环中。
  • 不费吹灰之力,我们都经历过——第二次总是很容易。 :D
【解决方案3】:

山姆,

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

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

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

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

【讨论】:

  • 我只需要创建一个脚本,该脚本将使用名为 AddCustomer 的存储过程自动将所有 CustoemrID 和 CustomerName 传递到另一个表中。我如何执行它并不重要。
  • 数据类型应该相同。我已经花时间检查了它。它们是客户 ID 的 uniquInde​​ntifier 和客户名称的 varchar
  • Sam,正如我在回答中所展示的,您在 customerid 变量上使用了错误的类型。
【解决方案4】:

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


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

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

否则你打算如何处理异常/

【讨论】:

  • 它是必需的。所以我别无选择。
  • 其实不是这种情况。您不能像 UDF 那样以基于集合的方式调用存储过程。
  • 为什么?我无法想象一个合理的建议,除非我能想象出一个可以合理解决的问题。
  • 你确定吗?所以不可能循环通过带有游标的存储过程?
  • Le Dorfier,发生了什么是我需要从客户表中重新填充一个名为 CustomerFilter 的表,其中包含来自客户的所有 CsutomerID 和 CustomerName。我只想编写一个脚本,使用我现有的 AddCustomers SP 自动将数据从客户转储到 CustomerFilters。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2020-02-12
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多