2011-07-12 121 views
74

如何在表值函数中声明变量?在表值函数中声明变量

+0

内联或多语句?像* MSDN *描述他们? – gbn

+9

@YogeshBhadauirya荒谬的“使用搜索引擎”响应的问题是* this *是搜索引擎指向的地方。一种无限的递归情况。最好删除页面或仅回答问题。 – Volvox

+24

这个问题值得更多的爱:重新开放,接受下面的答案。它实际上*是一个真正的问题。 – Askolein

回答

136

有两种风格的表值函数。一个只是一个select语句,一个可以有更多的行而不仅仅是一个select语句。

这不能有一个变量:

create function Func() returns table 
as 
return 
select 10 as ColName 

你要做这样的代替:

create function Func() 
returns @T table(ColName int) 
as 
begin 
    declare @Var int 
    set @Var = 10 
    insert into @T(ColName) values (@Var) 
    return 
end 
+1

谢谢,这非常有用 –

+13

第一个例子被称为“内联表值函数”,与多语句表值函数相比,它具有性能优势,即数据库服务器可以*用ITVF重新*查询*内联*到父查询中,实质上成为一个参数化的'VIEW',而MSTVF则更像一个不透明的存储过程(虽然与sprocs相比有其自身的优势)。内联函数应该优于MSTVF。如果您确实需要计算并存储中间值(例如复杂标量函数表达式的结果),则使用子查询。 – Dai

+0

也许值得一提的是,如果你用来填充你想要设置的变量的结果在任何方面都是可以通用的,那么你可以考虑编写一个单独的函数来生成它。 这将允许您使用上述@Dai所描述的ITVF及其所有优点,同时仍将动态生成的值插入到函数中。我只是在上述解决方案的帮助下编写了一个函数(谢谢@MikaelEriksson!),它将其参数之一传递给一个辅助函数,以免我必须使用MSTVF表单。 – naughtilus