tipos - SQL Server 2008-¿Cómo devuelvo un tipo de tabla definida por el usuario a partir de una función con valores de tabla?
tablas temporales vs variables tipo tabla sql server (5)
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 . 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)
)
- Declara tus variables
DECLARE @uddt MyCustomUDDT;
DECLARE @Modifieduddt MyCustomUDDT;
// Llamar a la función
INSERT INTO @Modifieduddt SELECT * FROM dbo.MyUDF(@uddt);
Firma de la 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
Espero que esto ayude a alguien.
Aquí está mi tipo de tabla definida por el usuario ...
CREATE TYPE [dbo].[FooType] AS TABLE(
[Bar] [INT],
)
Esto es lo que he tenido que hacer en mi función de 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 declaración RETURN de la función. ¿No hay una manera en que puedo simplemente declarar el tipo en la declaración RETURN?
Pensé que esto funcionaría:
CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes [FooType]
INSERT INTO @FooTypes (1)
RETURN
No se puede encontrar ayuda en MSDN / Google con respecto a esto ... ¿alguien?
EDITAR
Desmarqué mi respuesta y choqué con esta pregunta, ya que me encuentro con el mismo escenario 6 meses después.
¿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).
La sintaxis de CREATE FUNCTION indica que la única forma de definir un tipo de retorno de tabla es enumerando columnas y tipos, a <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.
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.
No, miedo 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 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 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.
Ok, entonces no se puede hacer.
Es lo suficientemente fácil como para duplicar la definición de la 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.