it-swarm.com.ru

Возврат нескольких значений из функции SQL Server

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

40
Jeremy Stein

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

см. здесь http://technet.Microsoft.com/en-us/library/ms191165.aspx , пример включен

33
devio

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

15
Rockcoder

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

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

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

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

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

OUTPUT Parameters

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

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

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

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

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

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

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

INSERT-EXEC

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

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

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

OPENQUERY

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

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

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

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

  • Не рекомендуется.
9
fordareh

Вот шаблон 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>   
    (<[email protected], , 1>,   
     <[email protected], , 'a'>)  
GO  
8
dkretz

Пример использования хранимой процедуры с несколькими параметрами 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(@[email protected][email protected])
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

1
surfmuggle