我正在使用TADOQuerySQL Server 2019 和 Delphi 10.4 Update 2。我試圖在一個 SQL 陳述句中解決更新或插入操作。
我已將該列定義IndexField為自動遞增列。
這是我的(簡化的)SQL Server 表:
CREATE TABLE [dbo].[Artikel]
(
[SuchBeg] [varchar](25) NULL,
[ArtNr] [varchar](25) NULL,
[IndexField] [bigint] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED ([IndexField] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
簡化的 SQL 陳述句:
UPDATE Artikel
SET [SuchBeg] = 'TEST',
[ArtNr] = '19904.S'
OUTPUT INSERTED.[IndexField]
WHERE [ArtNr] = '19904.S'
IF @@ROWCOUNT = 0
INSERT INTO Artikel ([SuchBeg], [ArtNr])
OUTPUT Inserted.[IndexField]
VALUES ('TEST', '19904.S');
德爾福原始碼:
Query := TADOQuery.Create(nil);
Query.Connection := ADOConnection;
try
Query.SQL.Text := sSqlText;
Query.Open;
Memo1.Lines.Add('Ado Result: ' Query.RecordCount.ToString ' ~ ' Query.Fields[0].AsString);
finally
Query.Free;
end;
如果我在我的 SQL 中點擊“更新部分”,我可以從查詢中讀取 1 行 1 欄位記錄集。但是,如果第二個“插入部分”被執行,我不會得到結果(0 行,1 欄位(Bigint)和 0)。
如果我在沒有“if Rowcount”的情況下執行“更新”或“插入”,它會起作用。
如果陳述句在 SQL Server Management Studio 中是 Executet,則它可以作業,并顯示 2 Result Windows。前 0 行受影響,第二行具有所需的值和 1 行受影響。

是否可以一次性完成此操作?
替代 Upsert 方法在這里......但我不想成為 SQL Server 超級英雄。
uj5u.com熱心網友回復:
嘗試將輸出存盤到表變數中,然后回傳該變數。
DECLARE @Output TABLE (IndexField BIGINT);
UPDATE Artikel SET [SuchBeg] = 'TEST', [ArtNr] = '19904.S' OUTPUT INSERTED.[IndexField] INTO @Output WHERE [ArtNr] = '19904.S'
if @@ROWCOUNT = 0
INSERT INTO Artikel ([SuchBeg], [ArtNr]) Output Inserted.[IndexField] INTO @Output VALUES ('TEST', '19904.S');
SELECT * FROM @Output;
uj5u.com熱心網友回復:
如果您只更新一行,則可以使用OUTPUT引數。我不確定 Delphi 方面,但 SQL 看起來像這樣
UPDATE Artikel
SET [SuchBeg] = 'TEST',
@IndexField = [IndexField]
WHERE [ArtNr] = '19904.S'
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Artikel ([SuchBeg], [ArtNr])
VALUES ('TEST', '19904.S');
SET @IndexField = SCOPE_IDENTITY();
END;
我必須說,我沒有看到將ArtNr列更新為相同值的意義
請注意,如果您想讓此 ACID 事務兼容,您將使用以下提示
SET XACT_ABORT ON; -- ensures rollback
BEGIN TRAN;
UPDATE Artikel WITH (UPDLOCK, HOLDLOCK)
SET [SuchBeg] = 'TEST',
@IndexField = [IndexField]
WHERE [ArtNr] = '19904.S'
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Artikel ([SuchBeg], [ArtNr])
VALUES ('TEST', '19904.S');
SET @IndexField = SCOPE_IDENTITY();
END;
COMMIT;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365082.html
標籤:sql-server 德尔福 废话
上一篇:如何在JSON路徑中使用路徑變數
下一篇:為什么需要CTE來執行以下操作
