时间:2010-06-17 06:46:39

标签: sql-server tsql

对于sql中的table valued函数,为什么我们不能在beginend标记中编写sql语句,如 -

create function dbo.emptable()
returns Table
as
BEGIN --it throws an error
return (select id, name, salary from employee)
END
go

scalar valued函数中,我们可以使用这些标记,如

create function dbo.countemp()
returns int
as
begin
return (select count(*) from employee)
end
go

是否有任何特定规则我们应该使用BEGIN & END标记

2 个答案:

答案 0 :(得分:0)

在INLINE TVF中(与您的第一个示例一样),BEGINEND会尝试强制它为程序代码,因此它将不再是内联TVF。标量函数仅以过程形式提供(这是糟糕的)。因此,在当前版本的SQL Server中通常应避免使用标量函数。

答案 1 :(得分:0)

  

多语句表值   功能稍微复杂一些   比其他两种类型的功能   因为它使用多个语句   构建返回的表   调用语句。不像   内联表值函数,一个表   必须显式声明变量   并定义。以下示例   展示了如何实现一个   多语句表值函数   填充并返回一个表   变量

USE Northwind
go
CREATE FUNCTION fx_OrdersByDateRangeAndCount
( @OrderDateStart smalldatetime, 
  @OrderDateEnd smalldatetime, 
  @OrderCount smallint )
RETURNS @OrdersByDateRange TABLE
  (  CustomerID nchar(5),
     CompanyName nvarchar(40),
     OrderCount smallint,
     Ranking char(1) )
AS
BEGIN
// statements that does some processing ....

END

从上面,我猜BEGINEND表示多个陈述的意图/用途&因此它需要定义表变量,如上面的代码所示。

来自http://www.sqlteam.com/article/intro-to-user-defined-functions-updated