sqlserver使用者自定義函式if判斷
最近專案開始驗收,搜尋那一塊需要改造實在是忙啊。
新來的同事需要寫一個sql函式:
查詢表tb_wf_privgrant,但還需要根據表中的member_id,member_type兩個欄位來獲取member_id對應的物件名稱,其中member_type分為U——使用者 ;G——組;R——角色...
她上週寫了一個函式,我去執行都執行不了,後來發現一個查詢出多條記錄的語句賦給一個變數。
然後把我的思路告訴她:
定義一個函式如: 函式名(member_id,member_type)
根據傳進來的membertype,如果為U,則到使用者表wf_org_user查詢memberID對應的使用者名稱;如果為G,則到組表wf_org_group查詢memberID對應的組名;如果為D,則到機構表wf_org_department查詢memberID對應的機構名,然後返回這查詢出來的結果不就可以了
select 函式名(member_id,member_type),其他欄位... from 表名
說了半天她還是不明白,改後發給我的還是傳一個引數member_type,還問我怎麼可能只有一條記錄,怎麼把引數傳進去,看來是思維定式了,上週我說她把查詢出來的多條記錄賦給一個變數,她的思維還停留在那邊。
沒辦法,最好只好說我幫她寫,順便也來溫習一下:
--建立使用者自定義函式
/****** 物件: UserDefinedFunction [dbo].[MemberName] 指令碼日期: 08/03/2009 11:18:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create function [dbo].[MemberName](@member_Id varchar(32),@member_type char(1))
returns varchar(300)
as
begin
Declare @memberName varchar(300)
if @member_type='R'
begin
set @memberName=(select name_ from wf_org_role where
end
else if @member_type='G'
begin
set @memberName=(select name_ from wf_org_group where [email protected]_Id)
end
else if @member_type= 'D'
begin
set @memberName=(select name_ from wf_org_department where [email protected]
end
else if @member_type= 'U'
begin
set @memberName=(select displayname_ from wf_org_user where [email protected]_Id)
end
return @memberName
end
--呼叫查詢語句例子
select dbo.MemberName(member_id,member_type),workflow_id,member_id,knowledge_code from tb_wf_privgrant
注意:
如果你這樣來呼叫:
select MemberName(member_id,member_type),workflow_id,member_id,knowledge_code from tb_wf_privgrant
可能會報:
訊息 195,級別 15,狀態 10,第 1 行
'MemberName' 不是可以識別的 內建函式名稱。
解決方案:
在自定義函式前加上所有者,如:dbo.