【发布时间】: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吗?对我来说,第二个IF是IF @idQC IS NOT NULL,而@idQC是NULL -
第二个
IF应该是IF @FldrInitKey IS NOT NULL -
好的,但是...好吧,你的第一个
IF是IF @TranCount = 0。你应该在你的问题而不是评论中澄清这一点 -
在你的 IF 语句中加入一些打印语句,看看它们是否被打印出来。确保事务正在提交。
-
什么意思,基本的T-SQL,还是第二个
IF
标签: sql-server if-statement stored-procedures