对于sql中的table valued
函数,为什么我们不能在begin
和end
标记中编写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
标记
答案 0 :(得分:0)
在INLINE TVF中(与您的第一个示例一样),BEGIN
和END
会尝试强制它为程序代码,因此它将不再是内联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
从上面,我猜BEGIN
和END
表示多个陈述的意图/用途&因此它需要定义表变量,如上面的代码所示。
来自http://www.sqlteam.com/article/intro-to-user-defined-functions-updated