Как мне вернуть несколько значений (например, число и строку) из пользовательской функции в SQL Server?
Возвращение нескольких значений из функции SQL Server
Ответ 1
сделать его табличной функцией
см. здесь http://technet.microsoft.com/en-us/library/ms191165.aspx, пример включен
Ответ 2
Другой вариант - использовать процедуру с выходными параметрами - Использование хранимой процедуры с выходными параметрами
Ответ 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
Это будет результат: