我正在尋找執行一個洗掉陳述句,該陳述句以 1000 個批次洗掉表中的資料庫行。該命令是從 powershell 腳本呼叫的。SQL命令如下...
USE AIS
GO
DECLARE
@rows INT = 1,
@batch_size INT = 1000,
@duration_in_days INT = -4
WHILE @rows > 0
BEGIN
--First delete all child rows to avoid FK issues
DELETE TOP (@batch_size)
FROM dbo.ais_audit
WHERE create_time < dateadd(day, @duration_in_days, getdate())
AND parent_audit_id IS NOT NULL;
--Now delete any parent rows
DELETE TOP (@batch_size)
FROM dbo.ais_audit
WHERE create_time < dateadd(day, @duration_in_days, getdate())
AND parent_audit_id IS NULL;
SELECT @rows = @@ROWCOUNT;
SELECT @rows AS 'DELETED ROW COUNT';
WAITFOR DELAY '00:00:01';
結尾 ”@
我在powershell中用來執行這個的命令是
Invoke-Sqlcmd -ServerInstance $Server -Database $Database -AccessToken $tok.Token -Query $command
運行上述程式后,前 1000 條記錄被洗掉,但隨后失敗并出現以下錯誤
" Invoke-Sqlcmd : The DELETE statement conflicted with the SAME TABLE REFERENCE constraint
"FK_AIS_AUDIT". The conflict occurred in database "AIS", table "dbo.ais_audit", column
'parent_audit_id'.
The statement has been terminated. "
從 SSMS 運行 SQL 陳述句作業正常,所以這似乎只是 Powershell 中的一個問題。
uj5u.com熱心網友回復:
根據您的 T-SQL,您無法保證您嘗試洗掉的父行批次與您剛剛洗掉的子行批次有任何關系。為確保您沒有外鍵沖突,您需要:
a) 在洗掉父行之前洗掉所有批次的子行,或者
b) 記錄要洗掉的一批子行的 parent_audit_ids 串列,然后使用此串列洗掉關聯的父行。
A 是更簡單的選項,但 B 將允許您洗掉關聯批次中的子行和父行。您選擇哪種取決于您的要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/416701.html
標籤:
上一篇:PowerShellExport-csv為NULL資料庫值寫入空字串。可以說什么都不寫嗎?
下一篇:轉換Json表
