SQL Server 2014: создать процедуру с выходным параметром курсора

Я новичок в этих хранимых процедурах, мой вопрос связан с выходным параметром курсора. в чем разница между выходным параметром курсора и обычной хранимой процедурой, например, просто переменной или влияет на результат или производительность запроса?

Я использую 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 

Я просто хочу понять, есть ли какой-либо другой вывод, который я не вижу, используя ключевые слова «cursor Variable Output» вместо использования «@variable datatype;»


person Deepak Kavin    schedule 08.02.2019    source источник
comment
зачем вам это? Я не слышал о параметрах вывода курсора. Но вы можете создать процедуру с курсором внутри...   -  person Eralper    schedule 08.02.2019
comment
Используйте ALT + S и ALT + X в окне запроса сервера sql, затем выберите «Хранимая процедура» в списке. то вы увидите эти три типа. Я пытаюсь понять мою концепцию SP. До того, как я увидел это, я чувствовал, что очень хорошо знаком с SP, но это вызывает у меня любопытство.   -  person Deepak Kavin    schedule 08.02.2019
comment
Я не знал этого. Спасибо, я научился новой вещи. Позвольте мне проверить, могу ли я понять документацию   -  person Eralper    schedule 08.02.2019
comment
Почему вы вообще пытаетесь вернуть курсор? Вам не нужно возвращать курсор для возврата результатов.   -  person Panagiotis Kanavos    schedule 08.02.2019
comment
Я думаю, это просто для рефакторинга кода и сделать его более модульным. Итак, у вас есть определение курсора, используемого для определенной области. Все остальные разработчики могут использовать один и тот же курсор, используя SP, возвращающий курсор... Я не фанат этой функции, я просто пытаюсь понять причину этого вопроса.   -  person Eralper    schedule 08.02.2019
comment
@DeepakKavin, хотя это может быть хорошим учебным упражнением, имейте в виду, что параметры курсора редко используются в SQL Server на практике. Я часто вижу, что код T-SQL мигрировал из других продуктов СУБД, которым требуются курсоры для получения результатов. SQL Server по умолчанию передает строки клиенту без необходимости использования курсора на стороне сервера. Как правило, лучше всего использовать обработку на основе наборов и избегать курсоров.   -  person Dan Guzman    schedule 08.02.2019


Ответы (2)


Deepak, пожалуйста, обратитесь к образцам документации по адресу ссылка

Если вы неоднократно используете один и тот же курсор в своих кодах 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
person Eralper    schedule 08.02.2019

Курсор в качестве вывода предназначен для инкапсуляции определения курсора. Это означает, что вы выполняете SP для получения курсора, который уже был инициализирован и связан с набором результатов, который неизвестен вызывающей стороне, но будет использоваться вызывающей стороной.

Это открывает потенциальную проблему, заключающуюся в том, что вызывающему объекту необходимо знать, в какие переменные следует привести извлекаемую строку, и потенциально может нарушить использование курсора, если это будет сделано неправильно. Этого бы не произошло, если бы SP возвращал результирующий набор с SELECT или вставлял, например, во временную таблицу, созданную снаружи.

На мой взгляд, полезного применения этому практически нет. Начнем с того, что в очень редких случаях вы хотите использовать курсор вообще, и обычно они связаны с операциями, которые не включают DML и включают системные операции, такие как создание файлов или отправка электронных писем. И даже в этих случаях сокрытие результирующего набора от вызывающей стороны кажется довольно неясным.

person EzLo    schedule 08.02.2019