【问题标题】:SQL Server 2008 - How do i return a User-Defined Table Type from a Table-Valued Function?SQL Server 2008 - 如何从表值函数返回用户定义的表类型?
【发布时间】:2011-03-06 14:18:48
【问题描述】:

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

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 个月后遇到了同样的情况。

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

【问题讨论】:

  • 确认 2014 年仍然不可能。

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


【解决方案1】:

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

【讨论】:

  • 我知道我不能从标量函数返回 UDT。但关于表函数 - 您可以返回表(或表变量)。 UDT 只是另一个表,所以无法理解为什么不能返回它。哦,好吧,也许在下一个版本的SS中。 =) 我这样做是因为我有一个表变量,它在许多函数/过程中被复制。因此,我将它放在 UDT 中以防止“干燥”。更易于维护等。
  • 我不敢相信这仍然是一个限制。 SQL Server 15 ...只是运行了一个简单的测试。得到“无效的语法,预期的表。
【解决方案2】:

好的 - 所以它不能完成。

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

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

【讨论】:

  • 我知道这是一个老问题,但是恕我直言,您应该取消标记您的答案并标记 James 的答案,因为它解释并很好地解决了问题。
【解决方案3】:

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

【讨论】:

  • 所以我想答案仍然是否定的。 :) 当。我试图在这里实现的只是 UDF 和调用它的代码之间的一种“合同”。保留 T-SQL “D-R-Y”。如果我不能从函数中返回它,即使在这里使用 UDTT 也没有多大意义。那好吧。还是谢谢。
【解决方案4】:

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

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

【讨论】:

  • 这是一个比当前标记的更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多