2015-11-17 29 views
0

我想創建一個用戶定義的函數,帶2個參數聯邦提交狀態字符1,其中有像S和M這樣的數據,它們是單一的,並且已經結婚了,第二個參數是狀態字符2,其中已經在表格中創建了數據EmployeeTransfers具有MS,FL,NY等。創建一個用戶定義的函數?

我有創建返回其數據類型的字符1 與此邏輯例子的代碼中的一個的functoin: IF狀態= NY和 聯邦歸檔單(S )則代碼爲A 或聯邦歸檔已婚(M)則代碼爲B

等等......

所以我的代碼我的回報是NULL我天璣KNW如何設置返回更具體的

create function dbo.GetStateFilingStatus 
(
    @federalfilingstatus char(1), 
    @state char(2) 
) returns char(1) 
as 
begin 
    declare @code char(1) = null 

    select @federalfilingstatus = EmpFederalFilingStatus from EmployeeTransfers 
    where @state = EmpTransferState 

    if (@state = 'MS' AND @federalfilingstatus = 'S') 
    set @code = 'A' 
    return @code 

    if (@state = 'MS' AND @federalfilingstatus = 'M') 
    set @code = 'M' 
    return @code 

    if (@state = 'NJ' AND @federalfilingstatus = 'S') 
    set @code = 'B' 
    return @code 

    if (@state = 'NJ' AND @federalfilingstatus = 'M') 
    set @code = 'A' 
    return @code 

    if (@state = 'AZ' AND @federalfilingstatus = 'S') 
    set @code = 'A' 
    return @code 

    if (@state = 'AZ' AND @federalfilingstatus = 'M') 
    set @code = 'B' 
    return @code 

    if (@state = 'CT' AND @federalfilingstatus = 'S') 
    set @code = 'F' 
    return @code 

    if (@state = 'CT' AND @federalfilingstatus = 'M') 
    set @code = 'M' 
    return @code 

    if (@state = 'DC' AND @federalfilingstatus = 'S') 
    set @code = 'S' 
    return @code 

    if (@state = 'DC' AND @federalfilingstatus = 'M') 
    set @code = 'Y' 
    return @code 

end 
Go 

我試着用

select dbo.GetStateFilingStatus(EmpTransferState ,EmpFederalFilingStatus) as StateFilingStatus from EmployeeTransfers 

我的回報是空值來執行它。

+0

你有任何標記MySQL *和* SQL Server的原因嗎? – DavidG

回答

1

您需要在您的IF語句添加BEGINEND

if (@state = 'MS' AND @federalfilingstatus = 'S') begin 
    set @code = 'A' 
    return @code 
end 

之前發生了什麼事是,如果沒有BEGIN - END報表RETURN語句評估第一IF語句後執行。


或者,你可以使用IF - ELSE IF組合來設置的@code值,並把RETURN聲明結尾。

IF <condition> BEGIN 
    SET @code = 'A' 
ELSE IF <condition> BEGIN 
    SET @code = 'B'  
END 

RETURN @code 
+0

感謝您的教訓,我也注意到其他問題是參數的順序,所以我先修改了寫入狀態,然後是federalfilingstatus,因爲if是倒序,我寫了第一個狀態和federalfilistatus,其中參數是反向的。 –

3

你的代碼的第一個回報返回,因爲它不知道它的,如果塊的一部分。只要清除所有的回報,並在最後得到一個回報。

這樣做的更好方法是創建一個可以加入的查找表。這樣,如果您需要添加備案狀態或狀態,則可以添加一行。如果你需要修改代碼,你可以更新表格。

+0

我同意。不要使用UDF(除非這是另一個dopey作業問題)。使用表 –

+0

感謝您的教訓,我也注意到其他問題,這是參數的順序,所以我先修改寫入狀態,然後是federalfilingstatus,因爲if是反向順序,我寫了第一個狀態和federalfilistatus,其參數是反向 –

2

您在IF之後缺少BEGINEND語句,否則SQL將執行將第一條語句視爲在IF塊內部,其餘部分在後面。無論如何,你不必在這裏使用@code變量所有,只是直接返回值:

if (@state = 'MS' AND @federalfilingstatus = 'S') 
    return 'A' 

if (@state = 'MS' AND @federalfilingstatus = 'M') 
    return 'M' 

if (@state = 'NJ' AND @federalfilingstatus = 'S') 
    return 'B' 

--etc.... 

更好的解決方案卻是使用一個查找表,而不是條件語句的這個複雜的列表。這樣你就可以添加到它,而不必擔心維護一個複雜的存儲過程。

+0

感謝教訓,我也注意到其他問題,這是參數的順序,所以我先修改寫入狀態,然後是federalfilingstatus,因爲如果是倒序,我寫了第一個狀態和federalfilistatus參數是反向的 –

相關問題