Подтвердить что ты не робот

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

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

4b9b3361

Ответ 3

Здесь шаблон 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  

Ответ 4

Erland Sommarskog имеет исчерпывающее сообщение о передаче данных в SQL Server, расположенном здесь:

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

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

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

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

Параметры OUTPUT

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

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

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

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

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

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

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

ВСТАВИТЬ-EXEC

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

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

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

OPENQUERY

  • Трюк с множеством ловушек. Обескураженный.

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

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

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

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

Ответ 5

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