我有3個不同的UPDATE
查詢的存儲過程。錯誤檢查SQL中的動態存儲過程
我希望每個查詢返回一個值。
如果失敗我不想讓過程到COMMIT
,我想要它到ROLLBACK
告訴我三個存儲過程中哪一個失敗。
我可以在非動態的情況下做到這一點,但由於某些原因,相同的規則似乎不適用於動態查詢。
這裏是我的代碼,我的嘗試:
ALTER PROCEDURE [dbo].[ASP_XXNominalBalanceUPDATE]
@ORGCODE VARCHAR(6),
@NewNominal INT,
@OldNominal INT,
@BalMonth CHAR(6),
@Amt Decimal(12,2),
@FINPERIODNR INT,
@InvDetailID INT,
@Err INT = 0,
@Rows INT = 0
AS
BEGIN TRAN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SET @Err = 0
SET @Rows = 0
UPDATE CostCodeBalance' + @ORGCODE + ' COB
SET COB.' + @BalMonth + ' = (SELECT COB.' + @BalMonth + ' FROM CostCodeBalance' + @ORGCODE + ' COB WHERE COB.CostCode = @OldNominal AND COB.FinPeriodNr = @FINPERIODNR) + @Amt
WHERE COB.CostCode = @OldNominal AND COB.FinPeriodNr = @FINPERIODNR
SELECT @Err = @@Error, @Rows = @@ROWCOUNT
UPDATE CostCodeBalance' + @ORGCODE + ' COB
SET COB.' + @BalMonth + ' = (SELECT COB.' + @BalMonth + ' FROM CostCodeBalance' + @ORGCODE + ' COB WHERE COB.CostCode = @NewNominal AND COB.FinPeriodNr = @FINPERIODNR) - @Amt
WHERE COB.CostCode = @NewNominal AND COB.FinPeriodNr = @FINPERIODNR
SELECT @Err = @@Error, @Rows = @@ROWCOUNT
UPDATE Posting' + @ORGCODE + ' PO
SET Nominal = @NewNominal
WHERE PO.Deleted = 0 AND PO.OrderRecNo = @InvDetailID AND PO.OrderType = ''SI''
SELECT @Err = @@Error, @Rows = @@ROWCOUNT;';
-- Check if succeeded to find.
If @Err = 0 AND @Rows > 0
COMMIT TRAN
ELSE
ROLLBACK TRAN
EXEC sp_executesql @sql, N'@ORGCODE VARCHAR(6), @NewNominal INT, @OldNominal INT, @BalMonth CHAR(6), @Amt Decimal(12,2), @FINPERIODNR INT, @InvDetailID INT, @Err INT, @Rows INT',
@ORGCODE, @NewNominal, @OldNominal, @BalMonth, @Amt, @FINPERIODNR, @InvDetailID, @Err, @Rows;
MySQL或MS SQL Server?不要標記不涉及的產品。 – jarlh
這裏肯定有一些問題。檢查@@錯誤和@@ ROWCOUNT每次都會被第三個查詢覆蓋。我會將它分成三個動態的sql調用,以便可以控制它。另外,如果你爲你的表使用了一個別名,你的動態sql會更容易閱讀,因爲你不需要一直在前面附加ORGCODE。 –
@SeanLange是不是可以在一個程序中完成?我有很多場景,我在一個過程中有多個查詢 – Justin