31

Aquí está mi definida por el usuario tipo de tabla ...SQL Server 2008 - ¿Cómo devuelvo un tipo de tabla definida por el usuario a partir de una función con valores de tabla?

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, im tener que volver -declarar mi definición de tipo en la instrucción RETURN de la función. ¿No hay una manera en que puedo simplemente declarar el tipo en la declaración RETURN?

yo habría pensado que esto funcionaría:

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

No se encuentra ninguna ayuda en MSDN/Google con respecto a este .... alguien?

EDITAR

que mi respuesta no marcados, y chocando esta pregunta - como me encuentro 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 a partir de una función con valores de tabla? Si no, ¿hay una solución mejor que no sea la que he hecho? (vuelve a declarar el tipo de nuevo).

+0

Confirmado aún no es posible con 2014. – dudeNumber4

Respuesta

9

Ok, así que no se puede hacer.

Lo suficientemente fácil como para duplicar la definición de tabla en el tipo de devolución (con el uso de scripts).

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

+2

Sé que esta es una pregunta antigua, pero IMVHO debe desmarcar su respuesta y marcar la respuesta de James, ya que explica y resuelve el problema muy bien. – slugster

0

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

+1

Sé que no puedo devolver un UDT desde una función escalar. Pero en lo que respecta a las funciones de tabla, puede devolver tablas (o variables de tabla). Un UDT es solo otra tabla, así que no puedo ver por qué no puedes devolverlo. Oh, bueno, tal vez en la próxima versión de SS. =) Im haciendo esto porque tengo una variable de tabla que se estaba duplicando entre numerosas funciones/procs. Por lo tanto, lo puse en un UDT para evitar ser "SECO". Más fácil de mantener, etc. – RPM1984

2

La sintaxis para CREATE FUNCTION indica que la única forma de definir un tipo de devolución de tabla es enumerando columnas y tipos, un <table_type_definition>. Incluso SQL Server "Denali" tiene la misma definición para <table_type_definition>. Aunque, curiosamente, su sintaxis no incluye funciones valoradas en la tabla de declaraciones múltiples, o cualquier otra cosa que haga referencia a este fragmento.

+3

Así que supongo que la respuesta sigue siendo no. :) Dang. Todo lo que trato de lograr aquí es un tipo de "contrato" entre el UDF y el código que lo está llamando. Mantiene el T-SQL "D-R-Y". No tiene mucho sentido usar el UDTT aquí si no puedo devolverlo desde la función. Oh bien. Gracias de cualquier manera. – RPM1984

0

No, temeroso por el momento, como por this question. Y lo siguiente de MSDN:

Restricciones

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

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

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

  • No se puede usar un parámetro con valores de tabla como destino de una instrucción SELECT INTO o INSERT EXEC. Un parámetro con valores de tabla puede estar en la cláusula FROM de SELECT INTO o en la secuencia INSERT EXEC o stored-procedure.

21

A pesar de que no se puede devolver el UDTT de una función, puede devolver una variable de tabla y recibirlo en un UDTT , siempre y cuando el partido esquema. El siguiente código se prueba en SQL Server 2008 R2

- Crea el UDTT

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

- Declarar las variables

DECLARE @uddt MyCustomUDDT; 
DECLARE @Modifieduddt MyCustomUDDT; 

// Llamar a la función

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

Función firma

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

Espero que esto ayude a alguien.

+0

Esta es una mejor respuesta que la actualmente marcada. – slugster

Cuestiones relacionadas