一分爲二,讓返回table的Function使用邏輯判斷

在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
這樣就可以順利實現預想功能了。

發佈了59 篇原創文章 · 獲贊 4 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章