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





Измените его на функцию с табличным значением
См., Например, следующий связь.
этот пример отличный спасибо за ссылку. есть ли способ вернуть строки из нескольких таблиц? я хочу вернуть 1 строку для таблицы A, 1 строку из таблицы B ... и так далее
Другой вариант - использовать процедуру с выходными параметрами - Использование хранимой процедуры с выходными параметрами
@ Fernando68: Итак? Функции и хранимые процедуры в T-SQL очень похожи. В зависимости от того, где OP использует функцию, ее можно преобразовать в хранимую процедуру. Если это так, то этот вопрос будет примером ху проблема, и этот ответ будет полезен для решения актуальной проблемы.
Вот шаблон 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
У Эрланда Соммарскога есть исчерпывающий пост о передаче данных в SQL Server, расположенный здесь:
http://www.sommarskog.se/share_data.html
Он охватывает SQL Server 2000, 2005 и 2008, и его, вероятно, следует прочитать во всех подробностях, поскольку в нем подробно описаны преимущества и недостатки каждого метода. Тем не менее, вот основные моменты статьи (по состоянию на июль 2015 г. они заморожены), чтобы предоставить условия поиска, которые можно использовать для получения более подробной информации:
This article tackles two related questions:
- How can I use the result set from one stored procedure in another, also expressed as How can I use the result set from a stored
procedure in a SELECT statement?- How can I pass a table data in a parameter from one stored procedure to another?
OUTPUT Parameters
- Not generally applicable, but sometimes overlooked.
Table-valued Functions
- Often the best choice for output-only, but there are several restrictions.
- Examples:
- Inline Functions: Use this to reuse a single SELECT.
- Multi-statement Functions: When you need to encapsulate more complex logic.
Using a Table
- The most general solution. My favoured choice for input/output scenarios.
- Examples:
- Sharing a Temp Table: Mainly for a single pair of caller/callee.
- Process-keyed Table: Best choice for many callers to the same callee.
- Global Temp Tables: A variation of process-keyed.
Table-valued Parameters
- Req. Version: SQL 2008
- Mainly useful when passing data from a client.
INSERT-EXEC
- Deceivingly appealing, but should be used sparingly.
Using the CLR
- Req. Version: SQL 2005
- Complex, but useful as a last resort when INSERT-EXEC does not work.
OPENQUERY
- Tricky with many pitfalls. Discouraged.
Using XML
- Req. Version: SQL 2005
- A bit of a kludge, but not without advantages.
Using Cursor Variables
- Not recommendable.
Как предложил пользователь 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
Это будет результат:

Прошу прощения, но снова вопрос касается функций, а не хранимых процедур, и кажется, что единственный способ ответить на этот вопрос - использовать функции с табличным значением, как описано выше.
Возможно, вы сможете управлять своей функцией, чтобы она возвращала строку с некоторым разделителем, например "результат1 | результат2 | результат3"