Возврат нескольких значений из функции SQL Server - PullRequest
43 голосов
/ 10 ноября 2008

Как бы я мог вернуть несколько значений (скажем, число и строку) из пользовательской функции в SQL Server?

Ответы [ 5 ]

34 голосов
/ 10 ноября 2008

сделать его табличной функцией

см. Здесь http://technet.microsoft.com/en-us/library/ms191165.aspx, включая пример

16 голосов
/ 10 ноября 2008

Другой вариант - использовать процедуру с выходными параметрами - Использование хранимой процедуры с выходными параметрами

9 голосов
/ 27 января 2012

Эрланд Соммарског имеет исчерпывающий пост о передаче данных в SQL Server, расположенный здесь:

http://www.sommarskog.se/share_data.html

Он охватывает SQL Server 2000, 2005 и 2008, и, вероятно, его следует прочитать во всех подробностях, поскольку в нем достаточно подробно описаны преимущества и недостатки каждого метода. Однако вот основные моменты статьи (замороженные во времени по состоянию на июль 2015 года) с целью предоставления поисковых терминов, которые можно использовать для просмотра более подробной информации:

В этой статье рассматриваются два связанных вопроса:

  • Как использовать набор результатов из одной хранимой процедуры в другой, также выраженный как Как использовать набор результатов из сохраненной
    процедура в операторе SELECT?
  • Как передать данные таблицы в параметре из одной хранимой процедуры в другую?

Параметры ВЫХОДА

  • Обычно не применяется, но иногда упускается из виду.

Табличные функции

  • Часто лучший выбор только для вывода, но есть несколько ограничений.
  • Примеры:
    • Встроенные функции: Используйте это для повторного использования одного SELECT.
    • Функции с несколькими операторами: когда вам нужно инкапсулировать более сложную логику.

Использование таблицы

  • Самое общее решение. Мой любимый выбор для сценариев ввода / вывода.
  • Примеры:
    • Совместное использование временной таблицы: в основном для одной пары вызывающий / вызываемый.
    • Таблица с технологическим ключом: лучший выбор для многих абонентов одного абонента.
    • Глобальные временные таблицы: вариант с технологическим ключом.

Табличные параметры

  • Req. Версия: SQL 2008
  • В основном полезно при передаче данных от клиента.

INSERT-EXEC

  • Обманчиво привлекательный, но его следует использовать с осторожностью.

Использование CLR

  • Req. Версия: SQL 2005
  • Сложно, но полезно в крайнем случае, когда INSERT-EXEC не работает.

OPENQUERY

  • Сложно со многими подводными камнями. Обескураженный.

Использование XML

  • Req. Версия: SQL 2005
  • Немного клуджа, но не без преимуществ.

Использование переменных курсора

  • Не рекомендуется.
8 голосов
/ 10 ноября 2008

Вот шаблон Query Analyzer для встроенной функции - по умолчанию он возвращает 2 значения:

-- =============================================  
-- Create inline function (IF)  
-- =============================================  
IF EXISTS (SELECT *   
   FROM   sysobjects   
   WHERE  name = N'<inline_function_name, sysname, test_function>')  
DROP FUNCTION <inline_function_name, sysname, test_function>  
GO  

CREATE FUNCTION <inline_function_name, sysname, test_function>   
(<@param1, sysname, @p1> <data_type_for_param1, , int>,   
 <@param2, sysname, @p2> <data_type_for_param2, , char>)  
RETURNS TABLE   
AS  
RETURN SELECT   @p1 AS c1,   
        @p2 AS c2  
GO  

-- =============================================  
-- Example to execute function  
-- =============================================  
SELECT *   
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>   
    (<value_for_@param1, , 1>,   
     <value_for_@param2, , 'a'>)  
GO  
1 голос
/ 02 апреля 2013

Пример использования хранимой процедуры с несколькими параметрами out

Как пользователь Mr. Brownstone предложил использовать хранимую процедуру ; чтобы все было легко, я создал минималистский пример. Сначала создайте хранимую процедуру :

Create PROCEDURE MultipleOutParameter
    @Input int,
    @Out1 int OUTPUT, 
    @Out2 int OUTPUT 
AS
BEGIN
    Select @Out1 = @Input + 1
    Select @Out2 = @Input + 2   
    Select 'this returns your normal Select-Statement' as Foo
          , 'amazing is it not?' as Bar

    -- Return can be used to get even more (afaik only int) values 
    Return(@Out1+@Out2+@Input)
END 

Вызов хранимой процедуры

Чтобы выполнить хранимую процедуру несколько локальных переменных необходимы для получения значения:

DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int 
EXEC @GetReturnResult = MultipleOutParameter  
    @Input = 1,
    @Out1 = @GetOut1 OUTPUT,
    @Out2 = @GetOut2 OUTPUT

Для просмотра значений содержимого вы можете сделать следующее

Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2 

Это будет результат:

Result of Stored Procedure Call with multiple out parameters

...