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

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

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

Miguel Zavala 28.04.2018 02:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
47
1
228 170
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Измените его на функцию с табличным значением

См., Например, следующий связь.

этот пример отличный спасибо за ссылку. есть ли способ вернуть строки из нескольких таблиц? я хочу вернуть 1 строку для таблицы A, 1 строку из таблицы B ... и так далее

Jose Manuel Ojeda 19.07.2018 15:32

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

@ Fernando68: Итак? Функции и хранимые процедуры в T-SQL очень похожи. В зависимости от того, где OP использует функцию, ее можно преобразовать в хранимую процедуру. Если это так, то этот вопрос будет примером ху проблема, и этот ответ будет полезен для решения актуальной проблемы.

Cameron Lee 07.01.2015 23:16

Вот шаблон 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 

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

Result of Stored Procedure Call with multiple out parameters

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

Fandango68 08.10.2014 09:05

Другие вопросы по теме