Подтвердить что ты не робот

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

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

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 месяцев.

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

4b9b3361

Ответ 1

Хорошо - так оно и не может быть сделано.

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

ограничения

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

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

  • Табличные значения параметров должны передаваться в качестве входных параметров READONLY в подпрограммы Transact-SQL. Вы не можете выполнять операции DML, такие как UPDATE, DELETE или INSERT, с табличным параметром в теле подпрограммы.

  • Нельзя использовать табличный параметр в качестве цели оператора SELECT INTO или INSERT EXEC. Табличный параметр может быть в предложении FROM оператора SELECT INTO или в строке INSERT EXEC или хранимой процедуре.