我正在使用原始 SQL 并嘗試在同一張表上進行更新然后插入,你認為我需要某種型別的事務或其他東西嗎?
如果我在同一個腳本檔案中添加一個INSERT然后是一個UPDATE,SQL 會遵守執行順序嗎?
到目前為止結束了這個:
IF NOT EXISTS (SELECT TOP 1 * FROM dbo.Settings
WHERE Descr = 'GL for Credit Memos')
BEGIN
SET IDENTITY_INSERT dbo.Settings ON
DECLARE @newOrderNo INT;
SET @newOrderNo = 7 -- OrderNo for credit memo to display below 'GL for A/P'
-- Update order no. for settings below 'GL for Credit Memo'
UPDATE dbo.Settings
SET [OrderNo] = [OrderNo] 1
WHERE [OrderNo] >= @newOrderNo
INSERT INTO [dbo].[Settings]
([SettingID],
[Created],
[Descr],
[Category],
[OrderNo],
[DataType],
[InActive],
[IsRequired])
VALUES
(198, -- New Enum value for setting ID for 'Gl for Credit Memo'
DEFAULT,
'GL for Credit Memo',
'Accounting',
@newOrderNo,
4,
NULL,
1)
SET IDENTITY_INSERT dbo.Settings OFF
END
uj5u.com熱心網友回復:
SQL 中的整個陳述句總是按順序執行。除了在單個陳述句中之外沒有重新排序(例如,在單個陳述句中可能更新行的順序UPDATE是未定義的)。
如果您想確保代碼以“全有或全無”的方式作業,您可能確實需要在這里進行交易。
但是您不需要任何復雜的捕獲/回滾代碼。與流行的觀點相反,它幾乎從來沒有必要,而且通常是有害的。
您需要做的唯一一件事是使用XACT_ABORT. 這告訴服務器確保回滾將始終發生,而不管任何錯誤。
SET XACT_ABORT ON;
BEGIN TRANSACTION;
-- your code here
COMMIT;
如果您在 SSMS 中執行,那么您將看到任何錯誤。如果從客戶端應用程式或腳本執行,您可以在客戶端應用程式中捕獲錯誤,然后將錯誤顯示給用戶和/或記錄它。
uj5u.com熱心網友回復:
在 SQL Server 中,自動提交事務在安裝程序中默認打開。這意味著對于大多數服務器來說,每個單獨的 SQL 陳述句在后臺打開一個事務,執行,然后如果陳述句成功則提交事務,或者如果陳述句失敗則回滾事務,所有這些都在幕后進行。
您可以通過發出一個BEGIN TRANSACTION陳述句來覆寫該行為,該陳述句將打開一個事務并使其保持打開狀態,直到您發出顯式COMMIT TRANSACTION或ROLLBACK陳述句。通常ROLLBACKwill 存在于CATCHa 的子句中TRY...CATCH。這些顯式陳述句之間的所有內容都將被視為單個事務。
在您的情況下,UPDATE將在一項交易中,而INSERT在另一筆交易中。
這是微軟檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/522415.html
標籤:sqlsql服务器
上一篇:在sqlserver中查找中位數
