2009-06-26 26 views
19

我知道T-SQL不是面向對象的。我需要編寫一組模仿C#中的方法重載的函數。T-SQL用戶定義的函數重載?

是否以任何方式支持T-SQL中的函數重載?如果有這樣做的黑客,是否建議?

+1

只是爲了將此問題保留爲有效的重複目標,SQL Server 2008,2008 R2或2012中尚未解決此問題。實際上,唯一有過近親號程序的問題已被棄用。 – 2012-11-27 23:04:27

回答

10

不,沒有辦法做到這一點。

我建議你重新審視這個要求,因爲「讓蘋果看起來像橘子」通常很難做到,而且值得懷疑。

+23

這不是「讓蘋果看起來像橘子」,函數重載是對不同數據類型進行類似操作的常見問題。這樣的恥辱T-SQL不支持它:( – matao 2011-05-24 05:57:51

+1

我同意matao它是對象關係數據庫管理系統的最基本的功能之一 – 2011-11-09 19:21:21

4

你可以通過sql_variant,但它周圍有各種各樣的危險;你不能像使用OO語言和重載一樣使用強類型。

如果您需要在函數中查找基本類型,則可以使用SQL_VARIANT_PROPERTY函數。

1

您可以在單個字符串中傳遞值數組並將其解析出using this techique by Erland Sommarskog

創建一個varchar(max)參數或功能的幾個,如果有必要,那麼在該字符串像您的參數值:

param1;param2;parma3;param4 

param1:type;param2:type;param3:type 

calltype|param1;param2;param3 

等,你只受限於你的想象力......

使用鏈接中的技術來拆分這個數組,並使用程序邏輯根據需要使用這些值。

-4

我一直都在重載函數,但我碰巧知道這些問題往往高度依賴於平臺。

在我們的DB2系統,我經常超負荷類似如下:

創建函數Schema1.F1(PARM日期) 返回日期 歸期+1個月;

CREATE Function Schema1.F1(parm timestamp) return date return date(timestamp)+ 1month;

當您有多個具有類似格式化要求的查詢時,這實際上非常有用。

到目前爲止,我發現的唯一問題是,最好確定要使用該函數,因爲標準拖放函數「schema」。「name」失敗,因爲它無法確定要刪除哪個函數。如果有人知道如何刪除重載的SQL函數,請告訴我!

5

我已經成功完成的一件事是以允許它處理空值的方式編寫函數,然後用空值代替您想要省略的參數調用它。

實施例:

create function ActiveUsers 
(
    @departmentId int, 
    @programId int 
) 
returns int 
as 
begin 
    declare @count int 

    select @count = count(*) 
    from users 
    where 
     departmentId = isnull(@departmentId, departmentId) 
     and programId = isnull(@programId, programId) 

    return @count 
end 
go 

用途:

select ActiveUsers(1,3) -- users in department 1 and program 3 
select ActiveUsers(null,3) -- all users in program 3, regardless of department 
select ActiveUsers(null,null) -- all users 
0

一個解決方案是利用所述sql_variant數據類型。只要您爲兩個值使用相同的數據類型,此示例就可以工作。返回您發送的任何數據類型。

create function dbo.Greater(
@val1 sql_variant 
,@val2 sql_variant 
) returns sql_variant 
as 
begin 
declare @rV sql_variant 

set @rV = case when @val1 >= @val2 then @val1 
       else @val2 end 

return @rV 
end 
go