SQL Server 2008 - ¿Cómo devuelvo un Tipo de Tabla Definido por el Usuario desde una Función con Valor de Tabla?


Aquí está mi tipo de tabla definido por el usuario...

CREATE TYPE [dbo].[FooType] AS TABLE(
 [Bar] [INT],
)

Esto es lo que he tenido que hacer en mi función con valores de tabla para devolver el tipo:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes TABLE ([Bar] [INT])
INSERT INTO @FooTypes (1)
RETURN

Básicamente, tengo que volver a declarar mi definición de tipo en la sentencia RETURN de la función. ¿No hay alguna manera de que pueda simplemente declarar el tipo en la declaración RETURN?

Habría pensado que esto funcionaría:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes [FooType]
INSERT INTO @FooTypes (1)
RETURN

No puede encontrar ninguna ayuda en MSDN/Google con respecto a esto....¿alguien?

EDITAR

I desmarcado mi respuesta, y golpear esta pregunta-como me estoy encontrando con el mismo escenario 6 meses más tarde.

¿Alguien tiene alguna idea de si es posible devolver un tipo de tabla definido por el usuario desde una función con valor de tabla? Si no es así, ¿hay una mejor solución alternativa que la que he hecho? (vuelva a declarar el tipo de nuevo).

Author: RPM1984, 2010-06-22

5 answers

Aunque no puede devolver el UDTT desde una función, puede devolver una variable de tabla y recibirla en un UDTT siempre que el esquema coincida con. El siguiente código se prueba en SQL Server 2008 R2

Create Crea la UDTT

CREATE TYPE dbo.MyCustomUDDT AS TABLE
(
    FieldOne varchar (512),
    FieldTwo varchar(1024)
)

Declare Declara tus variables

DECLARE @uddt MyCustomUDDT;
DECLARE @Modifieduddt MyCustomUDDT;

/ / Llama a la función

INSERT INTO @Modifieduddt SELECT * FROM dbo.MyUDF(@uddt);

Firma de función

CREATE FUNCTION dbo.MyUDF(@localUDDT MyCustomUDDT)
RETURNS @tableVar TABLE
(
    FieldOne varchar (512),
    FieldTwo varchar(1024)
)
AS
BEGIN
 --Modify your variable here
RETURN
END

Esperemos que esto ayude a alguien.

 30
Author: James Poulose,
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
2017-03-12 07:39:51

Ok - así que no se puede hacer.

Es bastante fácil duplicar la definición de la tabla en el tipo devuelto (con el uso de scripting).

Aún así, esperamos que este problema se rectifique en la próxima versión de SQL Server.

 9
Author: RPM1984,
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
2010-06-28 03:12:14

La sintaxis de CREATE FUNCTION indica que la única forma de definir un tipo de retorno de tabla es listando columnas y tipos, un <table_type_definition>. Incluso SQL Server "Denali" tiene la misma definición para <table_type_definition>. Aunque extrañamente, su sintaxis no incluye funciones con valor de tabla de sentencias múltiples, o cualquier otra cosa que haga referencia a este fragmento.

 2
Author: Damien_The_Unbeliever,
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
2010-12-16 09:01:00

No creo que esto sea posible. No puede usar un UDTT como el tipo de retorno de una Función con valor escalar porque no es un valor escalar. Tampoco puede reemplazar la declaración de tabla de una función con Valor de Tabla con un UDTT. Repetir la definición de la tabla parece ser la única opción. Si supiéramos por qué estás haciendo esto, tal vez podríamos encontrar una alternativa.

 0
Author: Schmalls,
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
2010-06-23 13:44:27

No, me temo que no en este momento, según esta pregunta. Y lo siguiente de msdn:

Restricciones

Los parámetros con valores de tabla tienen las siguientes restricciones:

  • SQL Server no mantiene estadísticas en columnas de parámetros con valores de tabla.

  • Los parámetros con valores de tabla se deben pasar como parámetros de entrada de SOLO lectura a las rutinas Transact-SQL. No puede realizar operaciones DML como ACTUALIZAR, ELIMINAR o INSERTAR en un parámetro de valor de tabla en el cuerpo de una rutina.

  • No puede usar un parámetro con valor de tabla como destino de una instrucción SELECT INTO o INSERT EXEC. Un parámetro con valor de tabla puede estar en la cláusula FROM de SELECT INTO o en la cadena INSERT EXEC o en el procedimiento stored.

 0
Author: Timbo,
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
2017-05-23 12:03:08