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

您的问题是您对字符串和sISNULL使用不同的类型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
于 2013-05-17T14:39:27.133 回答