2013-05-17 65 views
0

我遇到了我的SQL命令問題。該方法接收參數值,但總是返回最後一個if的值。如果不是正確的SQL命令

我該如何解決這個問題?案件?

謝謝

ALTER FUNCTION [dbo].[f_ResponsavelRisco] (@idDiretoria AS INT = NULL, @idArea AS INT = NULL, @idSubArea AS INT = NULL) 
RETURNS INT AS 
BEGIN 

    DECLARE @RETORNO INT 

    SET @RETORNO = 0 

    IF ISNULL(@idDiretoria,'') <> '' 
    SET @RETORNO = @idDiretoria 

    IF ISNULL(@idArea,'') <> '' 
    SET @RETORNO = @idArea 

    IF ISNULL(@idSubArea,'') <> '' 
    SET @RETORNO = @idSubArea 

    RETURN @RETORNO 
END 

不要工作。如果參數是@idDiretoria工作的權利,但如果參數@idArea不起作用。

ALTER FUNCTION [dbo].[f_ResponsavelRisco] (@idDiretoria AS INT = NULL, @idArea AS INT = NULL, @idSubArea AS INT = NULL) 
RETURNS INT AS 
BEGIN 

    DECLARE @RETORNO INT 

    SET @RETORNO = 0 

    IF @idDiretoria IS NOT NULL 
    SET @RETORNO = @idDiretoria 

    IF @idArea IS NOT NULL 
    SET @RETORNO = @idArea 

    IF @idSubArea IS NOT NULL 
    SET @RETORNO = @idSubArea 

    RETURN COALESCE(@idDiretoria, @idArea, @idSubArea, 0) 

END 
+0

你是怎麼調用這個函數的? –

+2

'RETURN COALESCE(@idDiretoria,@idArea,@idSubArea)''沒有'if's。 – danihp

+1

@danihp - 如果任何參數都是空字符串,則具有不同的語義。 –

回答

2
具有相同的語義

這裏:

RETURN COALESCE(NULLIF(@idDiretoria, ''), 
       NULLIF(@idArea, ''), 
       NULLIF(@idSubArea, '') 

但是,perhas,這是不夠的:

RETURN COALESCE(@idDiretoria, 
       @idArea, 
       @idSubArea) 

你也可以閱讀以下@Matthew和MartinSmith意見。

+0

+1,但不需要檢查「INT」類型上的空字符串。 – Matthew

+0

謝謝Mattew,我知道,但似乎這是和OP的要求,只是看到他們的評論。 – danihp

+0

我不認爲OP理解*爲什麼*他這樣做...... – Matthew

1

你的問題是,你ISNULL使用不同類型的字符串和INT小號

編輯:如果您提供@idSubArea那麼你應該總是期望這是返回的值,而不管是否不是你發送其他兩個參數。在下面的排名你已經優先返回值:

  1. @idSubArea
  2. @idArea
  3. @idDirectoria

任何更高級別的參數將被退回,無論較低等級的參數。

你的函數表明它們都是INT那麼爲什麼要檢查一個空白字符串?

你可以試試這個:如果你想保持相同的IF結構(我假設你有比你實際粘貼在這裏更多的邏輯)

ALTER FUNCTION [dbo].[f_ResponsavelRisco] (@idDiretoria AS INT = NULL, @idArea AS INT = NULL, @idSubArea AS INT = NULL) 
RETURNS INT AS 
BEGIN 

    DECLARE @RETORNO INT 

    SET @RETORNO = 0 

    IF @idDiretoria IS NOT NULL 
    SET @RETORNO = @idDiretoria 

    IF @idArea IS NOT NULL 
    SET @RETORNO = @idArea 

    IF @idSubArea IS NOT NULL 
    SET @RETORNO = @idSubArea 

    RETURN @RETORNO 
END 

如果你沒有更多的邏輯,則建議通過@danihp在評論部分是有效的,他應該把它變成一個答案,雖然他有錯誤的順序,請參閱以下更正:

 ALTER FUNCTION [dbo].[f_ResponsavelRisco] (@idDiretoria AS INT = NULL, @idArea AS INT = NULL, @idSubArea AS INT = NULL) 
RETURNS INT AS 
BEGIN 

   RETURN COALESCE(@idSubArea, @idArea, @idDiretoria, 0)     

END 
+0

@ConradFrix足夠公平......但如果提供了所有參數,那就是我們期望的行爲。 – Matthew

+0

@ConradFrix你完全正確,編輯答案。我讓他們錯誤的順序。 – Matthew

+0

+1非常好解釋。 – danihp