web-dev-qa-db-ja.com

SQL Server 2008-テーブル値関数からユーザー定義のテーブル型を返すにはどうすればよいですか?

これが私のユーザー定義のテーブルタイプです...

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

これは、型を返すために、テーブル値関数でivがしなければならないことです。

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

基本的に、関数のRETURNステートメントで型定義を再宣言する必要があります。 RETURNステートメントで型を簡単に宣言できる方法はありませんか?

私はこれがうまくいくと思っていたでしょう:

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

これに関してMSDN/Googleでヘルプを見つけることができません。

[〜#〜]編集[〜#〜]

6か月後に同じシナリオに遭遇したので、私は自分の答えのマークを外して、この質問をぶつけました。

テーブル値関数からユーザー定義のテーブル型を返すことができるかどうか誰かが考えていますか?そうでない場合、私が行ったこと以外のより良い回避策はありますか? (型を再度宣言します)。

43
RPM1984

わかりました-できません。

戻り値の型でテーブル定義を複製するのに十分簡単です(スクリプトを使用して)。

それでも、うまくいけば、この問題はSQL Serverの次のバージョンで修正されるでしょう。

8
RPM1984

関数からUDTTを返すことはできませんが、テーブル変数を返し、それをUDTTで受け取ることができますスキーマが一致する限り。次のコードはSQL Server 2008 R2でテストされています

-UDTTを作成する

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

-変数を宣言する

DECLARE @uddt MyCustomUDDT;
DECLARE @Modifieduddt MyCustomUDDT;

//関数を呼び出します

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

関数の署名

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

うまくいけば、これは誰かを助けるでしょう。

41
James Poulose

CREATE FUNCTION の構文は、テーブルの戻り値の型を定義する唯一の方法が、列と型をリストすること、つまり<table_type_definition>であることを示しています。でも SQL Server "Denali"<table_type_definition>と同じ定義を持っています。奇妙なことですが、その構文には複数ステートメントのテーブル値関数、またはこのフラグメントを参照するその他のものが含まれていません。

これが可能だとは思いません。 UDTTはスカラー値ではないため、スカラー値関数の戻り値の型としては使用できません。また、テーブル値関数のテーブル宣言をUDTTで置き換えることもできません。テーブル定義を繰り返すことが唯一のオプションのようです。なぜこれを行っているのかがわかっていれば、別の方法が見つかるかもしれません。

0
Schmalls