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.