31

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

CREATE TYPE [dbo].[FooType] AS TABLE(
[Bar] [INT], 
) 

这是香港专业教育学院在我的表值函数来做返回类型:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes TABLE ([Bar] [INT]) 
INSERT INTO @FooTypes (1) 
RETURN 

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

我还以为这会工作:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes [FooType] 
INSERT INTO @FooTypes (1) 
RETURN 

找不到对此....任何人在MSDN /谷歌的任何帮助吗?

编辑

我无人盯防我的答案,并撞到了这个问题 - 因为我6个月以后遇到同样的情况。

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

+0

确认仍然不可能与2014. – dudeNumber4 2015-01-22 14:11:46

回答

9

好的 - 所以不能这样做。

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

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

+2

我知道这是一个老问题,但IMVHO您应该取消选中您的答案并标记James的答案,因为它解释并很好地解决了问题。 – slugster 2017-01-11 03:36:24

0

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

+1

我知道我不能从一个标量函数返回一个UDT。 但是关于表函数 - 你可以返回表(或表变量)。一个UDT只是另一个表,所以不能看到你为什么不能返回它。哦,也许在SS的下一个版本中。 =) 我这样做是因为我有一个表变量被重复众多的函数/特效。因此,我把它放在UDT中以防止被“干”。更容易维护等。 – RPM1984 2010-06-25 00:01:14

2

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

+3

所以我想答案仍然没有。 :)当。所有我试图在这里实现的是UDF和调用它的代码之间的一种“契约”。保留T-SQL“D-R-Y”。如果我无法从函数中返回,那么即使在这里使用UDTT也没有多少意义。好吧。不管怎么说,还是要谢谢你。 – RPM1984 2010-12-16 09:17:33

0

不,现在不怕,根据this question。而从MSDN以下:

限制

表值参数有以下限制:

  • SQL Server不维护表值参数列的统计信息。

  • 表值参数必须作为输入READONLY参数传递给Transact-SQL例程。您无法对例程正文中的表值参数执行DML操作,例如UPDATE,DELETE或INSERT。

  • 不能使用表值参数作为SELECT INTO或INSERT EXEC语句的目标。表值参数可以位于SELECT INTO的FROM子句中,也可以位于INSERT EXEC字符串或存储过程中。

21

即使你不能从一个函数返回的UDTT,你可以返回一个表变量,并在UDTT 只要接受它作为模式匹配。下面的代码在SQL服务器测试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 

希望这会帮助某人。

+0

这是比当前标记的更好的答案。 – slugster 2017-01-11 03:34:03

相关问题