在SQL Server 2005中,函數分爲三種:返回單值函數,返回內聯table函數,返回多語句table函數,在返回table的函數中是不能使用邏輯的判斷和其他語句的,只能使用查詢語句。如果遇到這種情況,應該把需要進行邏輯判斷的部分封裝到另外的返回單值的函數裏。
比如如下的代碼是不能運行的:
Create Function [dbo].[F_BindedSuppliers](@SupplierID int)
RETURNS TABLE
as return
(
declare @MainSupplierID int
if exists(select 1 from dbo.SupplierBinder where MainSupplierID=@SupplierID)
begin
set @MainSupplierID=@SupplierID
end
else if exists(select 1 from dbo.SupplierBinder where SubSupplierID=@SupplierID)
select @MainSupplierID=MainSupplierID from dbo.SupplierBinder where SubSupplierID=@SupplierID
if @MainSupplierID is null
select @SupplierID as SupplierID
else
select @MainSupplierID as SupplierID
union
select SubSupplierID from SupplierBinder where MainSupplierID= @MainSupplierID
)
這樣將會收到語法錯誤的報告。進行邏輯函數拆分後,代碼如下:
go
CREATE FUNCTION [dbo].[GetMainSupplieID]
(@SupplierID int)
RETURNS int
AS
BEGIN
declare @MainSupplierID int
if exists(select 1 from dbo.SupplierBinder where MainSupplierID=@SupplierID)
begin
set @MainSupplierID=@SupplierID
end
else if exists(select 1 from dbo.SupplierBinder where SubSupplierID=@SupplierID)
select @MainSupplierID=MainSupplierID from dbo.SupplierBinder where SubSupplierID=@SupplierID
if @MainSupplierID is null
set @MainSupplierID=@SupplierID
return @MainSupplierID
END
go
Create Function [dbo].[F_BindedSuppliers](@SupplierID int)
RETURNS TABLE
as return
(
select [dbo].[GetMainSupplieID](@SupplierID) as SupplierID
union
select SubSupplierID from SupplierBinder where MainSupplierID= [dbo].[GetMainSupplieID](@SupplierID)
)
go
這樣就可以順利實現預想功能了。