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

RPM*_*984 42 t-sql sql-server user-defined-functions user-defined-types sql-server-2008

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

CREATE TYPE [dbo].[FooType] AS TABLE(
 [Bar] [INT],
)
Run Code Online (Sandbox Code Playgroud)

这是我在表值函数中必须要做的事情,以返回类型:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes TABLE ([Bar] [INT])
INSERT INTO @FooTypes (1)
RETURN
Run Code Online (Sandbox Code Playgroud)

基本上,我必须在函数的RETURN语句中重新声明我的类型定义.有没有办法我可以简单地在RETURN语句中声明类型?

我原以为这会起作用:

CREATE FUNCTION [dbo].[GetFoos]
RETURN @FooTypes [FooType]
INSERT INTO @FooTypes (1)
RETURN
Run Code Online (Sandbox Code Playgroud)

在MSDN/Google上找不到关于此的任何帮助....任何人?

编辑

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

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

Jam*_*ose 40

即使您无法从函数返回UDTT ,只要架构匹配,您就可以返回表变量并在UDTT中接收它.以下代码在SQL Server 2008 R2中进行了测试

- 创建UDTT

CREATE TYPE dbo.MyCustomUDDT AS TABLE
(
    FieldOne varchar (512),
    FieldTwo varchar(1024)
)
Run Code Online (Sandbox Code Playgroud)

- 声明你的变量

DECLARE @uddt MyCustomUDDT;
DECLARE @Modifieduddt MyCustomUDDT;
Run Code Online (Sandbox Code Playgroud)

//调用函数

INSERT INTO @Modifieduddt SELECT * FROM dbo.MyUDF(@uddt);
Run Code Online (Sandbox Code Playgroud)

功能签名

CREATE FUNCTION dbo.MyUDF(@localUDDT MyCustomUDDT)
RETURNS @tableVar TABLE
(
    FieldOne varchar (512),
    FieldTwo varchar(1024)
)
AS
BEGIN
 --Modify your variable here
RETURN
END
Run Code Online (Sandbox Code Playgroud)

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

  • 这是比当前标记的答案更好的答案. (6认同)

RPM*_*984 8

好的 - 所以无法完成.

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

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

  • 我知道这是一个老问题,但IMVHO你应该取消标记你的答案并标记詹姆斯的答案,因为它解释并很好地解决了这个问题. (8认同)