0

SQL コマンドに問題があります。このメソッドはパラメーター値を受け取りますが、常に最後の 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 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
4

2 に答える 2

2

ここでは同じセマンティックで:

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

しかし、おそらく、次のように十分です。

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

以下の @Matthew と MartinSmith のコメントを読むことができます。

于 2013-05-17T14:41:02.733 に答える
1

あなたの問題は、ISNULL文字列とINTsに異なる型を使用していることです

編集: @idSubArea を提供する場合は、他の 2 つのパラメーターを送信するかどうかに関係なく、それが返される値であると常に期待する必要があります。次のランクで戻り値を優先しました:

  1. @idサブエリア
  2. @idエリア
  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
于 2013-05-17T14:39:27.133 に答える