SQL Server 2008 - Как я могу вернуть пользовательский тип таблицы из табличной функции? - PullRequest
40 голосов
/ 22 июня 2010

Вот мой определяемый пользователем тип таблицы ...

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

Это то, что я должен был сделать в моей табличной функции, чтобы вернуть тип:

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 по этому поводу..yany?

РЕДАКТИРОВАТЬ

Я снял отметку с моего ответа и поднял этот вопрос - так как я столкнулся с тем же сценарием 6 месяцев спустя.Кто-нибудь имеет какие-либо идеи, если можно вернуть пользовательский тип таблицы из табличной функции?Если нет, есть ли лучший обходной путь, кроме того, что я сделал?(снова объявите тип).

Ответы [ 4 ]

36 голосов
/ 27 ноября 2014

Даже если вы не можете вернуть 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

Надеюсь, это кому-нибудь поможет.

7 голосов
/ 28 июня 2010

Хорошо, так что это не может быть сделано.

Достаточно просто скопировать определение таблицы в типе возврата (с использованием сценариев).

Тем не менее - надеюсь, эта проблема будет исправлена ​​в следующей версии SQL Server.

2 голосов
/ 16 декабря 2010

Синтаксис для CREATE FUNCTION указывает, что единственный способ определить тип возвращаемого значения в таблице - перечислить столбцы и типы, a <table_type_definition>. Даже SQL Server "Denali" имеет то же определение для <table_type_definition>. Хотя это странно, но его синтаксис не включает табличные функции с несколькими операторами или что-либо еще, ссылающееся на этот фрагмент.

0 голосов
/ 23 июня 2010

Я не верю, что это возможно.Нельзя использовать UDTT в качестве возвращаемого типа функции со скалярным значением, поскольку это не скалярное значение.Вы также не можете заменить объявление таблицы для табличной функции на UDTT.Повторение определения таблицы кажется единственным вариантом.Если бы мы знали, почему вы это делаете, возможно, мы могли бы найти альтернативу.

...