Ответ 1
Хорошо - так оно и не может быть сделано.
Достаточно легко дублировать определение таблицы в возвращаемом типе (с использованием скриптов).
Все еще - надеюсь, эта проблема будет исправлена в следующей версии SQL Server.
Здесь мой пользовательский тип таблицы...
CREATE TYPE [dbo].[FooType] AS TABLE(
[Bar] [INT],
)
Это то, что ive должно было сделать в моей табличной функции, чтобы вернуть тип:
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 месяцев.
Кто-нибудь знает, возможно ли вернуть тип таблицы, определенный пользователем, из функции, связанной с таблицей? Если нет, есть ли лучшее обходное решение, кроме того, что я сделал? (снова объявите тип).
Хорошо - так оно и не может быть сделано.
Достаточно легко дублировать определение таблицы в возвращаемом типе (с использованием скриптов).
Все еще - надеюсь, эта проблема будет исправлена в следующей версии SQL Server.
Даже если вы не можете вернуть 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
Надеюсь, это поможет кому-то.
Синтаксис CREATE FUNCTION указывает, что единственный способ определить тип возвращаемого таблиц - это перечисление столбцов и типов, a <table_type_definition>
. Даже SQL Server "Denali" имеет то же определение для <table_type_definition>
. Хотя это странно, синтаксис не включает многозначные табличные функции или что-то еще, ссылающееся на этот фрагмент.
Я не считаю, что это возможно. Вы не можете использовать UDTT как возвращаемый тип Scalar-Valued Function, потому что он не является скалярным значением. Вы также не можете заменить объявление таблицы табличной функцией на UDTT. Повторение определения таблицы, по-видимому, является единственным вариантом. Если бы мы знали, почему вы это делаете, возможно, мы сможем найти альтернативу.
Нет, боюсь не в данный момент, согласно этому вопросу. И следующее с этой страницы Microsoft:
ограничения
Табличные значения имеют следующие ограничения:
SQL Server не ведет статистику по столбцам табличных параметров.
Табличные значения параметров должны передаваться в качестве входных параметров READONLY в подпрограммы Transact-SQL. Вы не можете выполнять операции DML, такие как UPDATE, DELETE или INSERT, с табличным параметром в теле подпрограммы.
Нельзя использовать табличный параметр в качестве цели оператора SELECT INTO или INSERT EXEC. Табличный параметр может быть в предложении FROM оператора SELECT INTO или в строке INSERT EXEC или хранимой процедуре.