SQL Server 2008 - 如何从表值函数返回用户定义的表类型?

时间:2010-06-22 01:08:49

标签: sql-server tsql sql-server-2008 user-defined-functions user-defined-types

这是我用户定义的表格类型......

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上找到任何有关此问题的帮助......任何人?

修改

我没有标记我的答案,碰到了这个问题 - 因为我在6个月后遇到了同样的情况。

有没有人知道是否可以从表值函数返回用户定义的表类型?如果没有,除了我所做的以外,还有更好的解决方法吗? (再次重新声明类型)。

4 个答案:

答案 0 :(得分:36)

即使您无法从函数返回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

希望这会对某人有所帮助。

答案 1 :(得分:7)

好的 - 所以无法完成。

很容易在返回类型中复制表定义(使用脚本)。

仍然 - 希望这个问题在下一版本的SQL Server中得到纠正。

答案 2 :(得分:2)

CREATE FUNCTION的语法表明定义表返回类型的唯一方法是列出列和类型<table_type_definition>。即使SQL Server "Denali"<table_type_definition>也有相同的定义。虽然奇怪的是,它的语法不包括多语句表值函数,或者引用此片段的任何其他函数。

答案 3 :(得分:0)

我不相信这是可能的。您不能将UDTT用作标量值函数的返回类型,因为它不是标量值。您也不能用UDTT替换表值函数的表声明。重复表定义似乎是唯一的选择。如果我们知道你为什么要这样做,也许我们可以找到另一种选择。