web-dev-qa-db-fra.com

SQL Server 2008 - Comment renvoyer un type de table défini par l'utilisateur à partir d'une fonction table?

Voici mon type de table défini par l'utilisateur ...

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

C'est ce que ive devait faire dans ma fonction table pour retourner le type:

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

Fondamentalement, je dois déclarer à nouveau ma définition de type dans l'instruction RETURN de la fonction. N'y a-t-il pas un moyen de déclarer simplement le type dans l'instruction RETURN?

J'aurais pensé que cela fonctionnerait:

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

Vous ne trouvez aucune aide sur MSDN/Google à ce sujet ... quelqu'un?

MODIFIER

J'ai décoché ma réponse et j'ai heurté cette question - car je rencontre le même scénario 6 mois plus tard.

Quelqu'un a-t-il une idée s'il est possible de renvoyer un type de table défini par l'utilisateur à partir d'une fonction de valeur de table? Sinon, existe-t-il une meilleure solution de contournement autre que ce que j'ai fait? (déclarez à nouveau le type).

43
RPM1984

Ok - donc ça ne peut pas être fait.

Assez facile pour dupliquer la définition de table dans le type de retour (avec l'utilisation de scripts).

Nous espérons que ce problème sera corrigé dans la prochaine version de SQL Server.

8
RPM1984

Même si vous ne pouvez pas retourner l'UDTT à partir d'une fonction, vous pouvez renvoyer une variable de table et la recevoir dans un UDTT tant que le schéma correspond. Le code suivant est testé dans SQL Server 2008 R2

- Créer l'UDTT

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

- Déclarez vos variables

DECLARE @uddt MyCustomUDDT;
DECLARE @Modifieduddt MyCustomUDDT;

// Appelle la fonction

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

Signature de fonction

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

J'espère que cela aidera quelqu'un.

41
James Poulose

La syntaxe pour CREATE FUNCTION indique que la seule façon de définir un type de retour de table est de répertorier les colonnes et les types, un <table_type_definition>. Même SQL Server "Denali" a la même définition pour <table_type_definition>. Bien qu'étrangement, sa syntaxe n'inclut pas les fonctions de valeur Table multi-instructions, ni rien d'autre qui fasse référence à ce fragment.

2

Je ne pense pas que ce soit possible. Vous ne pouvez pas utiliser un UDTT comme type de retour d'une fonction à valeurs scalaires car ce n'est pas une valeur scalaire. Vous ne pouvez pas non plus remplacer la déclaration de table d'une fonction table par un UDTT. La répétition de la définition du tableau semble être la seule option. Si nous savions pourquoi vous faisiez cela, nous pourrions peut-être trouver une alternative.

0
Schmalls