1. 程式人生 > >sqlserver使用者自定義函式if判斷

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

[email protected]_Id)
          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]
_Id
)
          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.