【问题标题】:SQL Server stored procedure multiple IF statementsSQL Server 存储过程多个 IF 语句
【发布时间】:2016-08-09 04:50:34
【问题描述】:

我有一个具有三个条件的 SQL Server 存储过程。目前,无论参数如何,都只会执行第一个 IF 块:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

/*
DESCRIPTION: Assigns/reassigns orders in [GIS].[dbo].[QCOrders]
PARAMETERS:
    @FldrInitKey    VARCHAR(30) = NULL,
    @UserName       VARCHAR(20) = NULL,
    @QCTrack        DECIMAL(6,2),
    @WF             BIT,
    @idQC           INT         = NULL
RETURNS:
    @RC 0 (success), 1 (failure)
EXAMPLE:
    EXEC spQCAssignOrders '889G1Pt', 'arajendran', '2016.10', '0', NULL
MODIFICATIONS:
    03/10/2016  A.Rajendran Created
*/

ALTER PROCEDURE [dbo].[spQCAssignOrders]
    @FldrInitKey VARCHAR(30) = NULL,
    @UserName    VARCHAR(20) = NULL,
    @QCTrack     DECIMAL(6,2),
    @WF          BIT,
    @idQC        INT = NULL
AS
    SET NOCOUNT ON
    SET ROWCOUNT 0
    SET XACT_ABORT ON

BEGIN TRY
    /* Declare and initialize variables */
    DECLARE @RC INT, @TranCount INT

    SELECT 
        @RC = 0, @TranCount = @@TRANCOUNT

    IF @TranCount = 0 
    BEGIN TRANSACTION
        IF @idQC IS NOT NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = CASE  
                                 WHEN @UserName IS NULL 
                                    THEN NULL
                                    ELSE GETDATE()
                              END,
                Unable = NULL,
                Error = NULL,
                CompletedDate = NULL,
                AdminCheck = NULL
            WHERE 
                idQC = @idQC
        END

        IF @FldrInitKey IS NOT NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = GETDATE()
            WHERE   
                QCTrack = @QCTrack
                AND FldrInitKey = @FldrInitKey
                AND WellsFargo = @WF
                AND UserName IS NULL
                AND Unable <> 1
        END

        IF @FldrInitKey IS NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = GETDATE()
            WHERE   
                QCTrack = @QCTrack
                AND WellsFargo = @WF
                AND UserName IS NULL
                AND Unable <> 1
        END

        IF @TranCount = 0 AND (XACT_STATE()) = 1 
           COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF (XACT_STATE()) = -1 
            ROLLBACK TRANSACTION

        EXEC [TOD].[dbo].[spRethrowError]
        SET @RC = 1
    END CATCH

    SET NOCOUNT OFF
    SET ROWCOUNT 0

    RETURN @RC


GRANT EXECUTE ON [GIS].[dbo].[spQCAssignOrders] TO db_allowexec

如果我想执行这个:

EXEC spQCAssignOrders '889G1Pt', 'arajendran', '2016.10', '0', NULL

第二个 IF 语句应该执行,但它没有。为什么?

澄清

第二个 IF 语句:

IF @FldrInitKey IS NOT NULL
BEGIN
    UPDATE [GIS].[dbo].[QCOrders] 
    SET UserName = @UserName,
        AssignedDte = GETDATE()
    WHERE  
        QCTrack = @QCTrack
        AND FldrInitKey = @FldrInitKey
        AND WellsFargo = @WF
        AND UserName IS NULL
        AND Unable <> 1
END

【问题讨论】:

  • 你能指定哪个IF吗?对我来说,第二个IFIF @idQC IS NOT NULL,而@idQCNULL
  • 第二个IF应该是IF @FldrInitKey IS NOT NULL
  • 好的,但是...好吧,你的第一个 IF IF @TranCount = 0。你应该在你的问题而不是评论中澄清这一点
  • 在你的 IF 语句中加入一些打印语句,看看它们是否被打印出来。确保事务正在提交。
  • 什么意思,基本的T-SQL,还是第二个IF

标签: sql-server if-statement stored-procedures


【解决方案1】:

您可以大大简化这一点。所有三个更新语句都可以变成一个更新语句。这应该相当于所有三个。

UPDATE [GIS].[dbo].[QCOrders]
                SET 
                    UserName    = @UserName,
                    AssignedDte = 
                    CASE    
                        WHEN @idQC IS NOT NULL and @UserName IS NULL THEN NULL
                        ELSE GETDATE()
                    END

            WHERE   QCTrack         = @QCTrack
                    AND FldrInitKey = ISNULL(@FldrInitKey, FldrInitKey)
                    AND WellsFargo  = @WF
                    AND UserName IS NULL
                    AND Unable <> 1

【讨论】:

  • AssignedDte x2 让我很困惑。此外,表中的 FldrInitKey 永远不会为 NULL,它有一个值范围。因此,ISNULL 语句将不起作用。不过,有时,我需要执行而不考虑 FldrInitKey 值。
  • 仔细查看那个 ISNULL。它不是在查看列,而是在查看您的变量。 AssignedDte 部分只是我的一个错字。我会修好它。 :)
猜你喜欢
  • 2010-12-24
  • 2010-12-21
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多