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?
5 answers
Que sea una función con valor de tabla
Ver aquí http://technet.microsoft.com/en-us/library/ms191165.aspx , ejemplo incluido
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
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.
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
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:
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