【问题标题】:SQL Server 2014: create procedure with cursor output parameterSQL Server 2014:使用游标输出参数创建过程
【发布时间】:2019-02-08 10:12:50
【问题描述】:

我是这个存储过程的新手,我的问题与游标输出参数有关。游标输出参数和普通的存储过程(比如它只是一个变量或者它影响查询的结果或性能)有什么区别?

我使用的是 SQL Server 2014。创建存储过程我使用了快捷键 alt+k、alt+x。在我选择存储过程后的列表中,它要求选择存储过程类型:

  1. 创建过程基本模板
  2. 使用游标输出参数创建过程
  3. 使用输出参数创建过程。

我无法理解第二种存储过程类型。我试图谷歌但没有得到足够的信息。任何在这里帮助我理解的人将不胜感激。我附上了第二个存储过程类型示例脚本

CREATE PROCEDURE dbo.Sample_Procedure 
    @sample_procedure_cursor CURSOR VARYING OUTPUT
AS
    SET @sample_procedure_cursor = CURSOR FOR
        select 1
    OPEN @sample_procedure_cursor 
RETURN 0 

我只是想了解使用“光标变化输出”关键字而不是使用“@variable datatype;”是否有任何其他我看不到的输出

【问题讨论】:

  • 为什么需要这个?我没有听说过游标输出参数。但是您可以创建一个内部有光标的过程...
  • 在 sql server 查询窗口中使用 ALT+S 和 ALT+X 然后在列表中选择存储过程。然后你会看到这三种类型。我想弄清楚我的 SP 概念。在我看到这个之前,我觉得我很了解 SP 但这让我很好奇。
  • 我不知道。谢谢我学到了新东西。让我检查一下我是否能理解文档
  • 你为什么要返回一个游标?您不需要返回游标来返回结果。
  • @DeepakKavin,虽然这可能是一个很好的学习练习,但请注意,实际上 SQL Server 中很少使用游标参数。我经常看到 T-SQL 代码中的那些从需要游标来检索结果的其他 DBMS 产品迁移。 SQL Server 本机将行流式传输到客户端,而不需要服务器端游标。通常最好使用基于集合的处理并避免使用游标。

标签: sql-server database stored-procedures database-cursor


【解决方案1】:

Deepak 请参考reference的文档示例

如果您在 SQL 代码中重复使用同一个游标,您可以将游标的定义包装到 SP 中,稍后再引用。

我复制下面的示例代码

首先创建程序

CREATE PROCEDURE dbo.uspCurrencyCursor   
    @CurrencyCursor CURSOR VARYING OUTPUT  
AS  
    SET NOCOUNT ON;  
    SET @CurrencyCursor = CURSOR  
    FORWARD_ONLY STATIC FOR  
      SELECT CurrencyCode, Name  
      FROM Sales.Currency;  
    OPEN @CurrencyCursor;  
GO

然后按如下方式使用

DECLARE @MyCursor CURSOR;  
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;  
WHILE (@@FETCH_STATUS = 0)  
BEGIN;  
     FETCH NEXT FROM @MyCursor;  
END;  
CLOSE @MyCursor;  
DEALLOCATE @MyCursor;  
GO

【讨论】:

    【解决方案2】:

    作为输出的游标是为了封装游标的定义。这意味着您执行一个 SP 来检索一个已经初始化并链接到调用者未知但调用者将使用的结果集的游标。

    这会带来一个潜在的问题,即调用者需要知道将获取行转换为哪些变量,如果操作不正确,可能会破坏游标的使用。例如,如果 SP 返回带有 SELECT 的结果集或插入到外部创建的临时表中,则不会发生这种情况。

    在我看来,几乎没有什么有用的应用。首先,您希望在极少数情况下根本使用光标,并且它们通常用于不涉及 DML 且涉及系统操作的操作,例如创建文件或发送电子邮件。即使在这些情况下,对调用者隐藏结果集似乎也很模糊。

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 2018-02-07
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多