Devuelve múltiples valores desde una función SQL Server


¿Cómo devolvería múltiples valores (por ejemplo, un número y una cadena) de una función definida por el usuario en SQL Server?

Author: Jeremy Stein, 2008-11-10

5 answers

Que sea una función con valor de tabla

Ver aquí http://technet.microsoft.com/en-us/library/ms191165.aspx , ejemplo incluido

 32
Author: devio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 20:19:12

Otra opción sería usar un procedimiento con parámetros de salida - Usando un Procedimiento Almacenado con Parámetros de salida

 14
Author: Rockcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 20:22:01

Erland Sommarskog tiene una publicación exhaustiva sobre el paso de datos en SQL Server ubicada aquí:

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

Cubre SQL Server 2000, 2005 y 2008, y probablemente debería leerse en todo su detalle, ya que hay una amplia cobertura de las ventajas e inconvenientes de cada método. Sin embargo, aquí están los aspectos más destacados del artículo (congelado en el tiempo a partir de julio de 2015) en aras de proporcionar términos de búsqueda que se pueden usar para lucir más grandes detalles:

Este artículo aborda dos cuestiones relacionadas:

  • Cómo puedo usar el conjunto de resultados de un procedimiento almacenado en otro, también expresado como Cómo puedo usar el conjunto de resultados de un procedimiento almacenado
    procedimiento en una declaración SELECT?
  • ¿Cómo puedo pasar los datos de una tabla en un parámetro de un procedimiento almacenado a otro?

Parámetros de SALIDA

  • No es de aplicación general, pero a veces se pasa por alto.

Funciones con valores de Tabla

  • A menudo la mejor opción para solo salida, pero hay varias restricciones.
  • Ejemplos:
    • Funciones en línea: Use esto para reutilizar una sola SELECCIÓN.
    • Funciones Multi-sentencia: Cuando se necesita encapsular una lógica más compleja.

Usando una Tabla

  • La solución más general. Mi opción preferida para escenarios de entrada / salida.
  • Ejemplos:
    • Compartir una tabla Temporal: Principalmente para un solo par de llamante/destinatario.
    • Tabla con clave de proceso: La mejor opción para muchos llamantes al mismo destinatario.
    • Tablas Temp globales: Una variación de proceso-keyed.

Parámetros de los valores de la tabla

  • Req. Versión: SQL 2008
  • Principalmente útil cuando se pasan datos de un cliente.

INSERT-EXEC

  • Engañosamente atractivo, pero debe ser utilizado con moderación.

Usando el CLR

  • Req. Versión: SQL 2005
  • Complejo, pero útil como último recurso cuando INSERT-EXEC no funciona.

[20]}

  • Difícil con muchas trampas. Desanimar.

Usando XML

  • Req. Versión: SQL 2005
  • Un poco de un kludge, pero no sin ventaja.

Usando Variables de Cursor

  • No es recomendable.
 9
Author: fordareh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 14:48:17

Aquí está la plantilla del Analizador de consultas para una función en línea: devuelve 2 valores por defecto:

-- =============================================  
-- 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  
 8
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 06:23:31

Ejemplo de uso de un procedimiento almacenado con múltiples parámetros de salida

Como sugirió el Usuario Mr. Brownstone puede usar un procedimiento almacenado ; para hacerlo fácil para todos, creé un ejemplo minimalista. Primero crear un procedimiento almacenado :

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 

Llamando al procedimiento almacenado

Para ejecutar el procedimiento almacenado se necesitan unas pocas variables locales para recibir el valor:

DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int 
EXEC @GetReturnResult = MultipleOutParameter  
    @Input = 1,
    @Out1 = @GetOut1 OUTPUT,
    @Out2 = @GetOut2 OUTPUT

Para ver el contenido de los valores puede hacer el siguiente

Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2 

Este será el resultado:

Resultado de la Llamada al procedimiento Almacenado con múltiples parámetros de salida

 0
Author: surfmuggle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-02 19:13:08