SQL Server 2008 - Как вернуть определяемый пользователем тип таблицы из табличной функции?

вот мой пользовательский тип таблицы...

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 относительно этот....кто?

редактировать

Я unmarked мой ответ, и натыкаясь на этот вопрос - как я сталкиваюсь с тем же сценарием 6 месяцев спустя.

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

5 ответов


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

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


Ok-так что это не может быть сделано.

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

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


синтаксис СОЗДАТЬ ФУНКЦИЮ указывает, что единственный способ определить тип возвращаемой таблицы-перечислить столбцы и типы, A <table_type_definition>. Даже SQL Server "Denali" имеет такое же определение для <table_type_definition>. Хотя, как ни странно, это синтаксис не включает в себя многопозиционные табличные функции или что-либо еще, что ссылается на этот фрагмент.


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


нет, боюсь, не в данный момент, согласно этот вопрос. И следующее из msdn:

ограничения

табличные параметры имеют следующие ограничения:

  • SQL Server не поддерживает статистику по столбцам табличных параметров.

  • табличные параметры должны передаваться в качестве входных параметров только для чтения в процедуры Transact-SQL. Нельзя выполнять ДМЛ такие операции, как обновление, удаление или вставка табличного параметра в теле подпрограммы.

  • нельзя использовать возвращающий табличное значение параметр в качестве цели инструкции SELECT INTO или INSERT EXEC. Возвращающий табличное значение параметр может быть в предложении FROM SELECT INTO или INSERT EXEC string или stored-procedure.