我在 SQL Server 中有存盤程序。在此程序中,我洗掉了重復記錄并將一條唯一記錄插入到表中。當我插入新的唯一記錄時,我正在使用下面的腳本。
SET IDENTITY_INSERT tbl_personnel_info ON
INSERT INTO tbl_personnel_info (pk_id, first_name, last_name, department, age, phone_number)
SELECT pk_id, first_name, last_name, department, age, phone_number
FROM #Unique
SET IDENTITY_INSERT tbl_personnel_info Off
這個腳本一切正常,但在生產SET IDENTITY_INSERT命令中需要 ALTER 權限。授予此權限應該很危險,因此我無法授予此權限。我還必須插入舊的 pk_id 而不是新的。SET IDENTITY_INSERT沒有命令我怎么能做到這一點。
例如我有那些記錄。
| 名 | 姓 | 部 | 年齡 | 電話號碼 |
|---|---|---|---|---|
| 約翰 | 能源部 | 它 | 21 | XXX |
| 約翰 | 能源部 | 金融 | 22 | 年年 |
| 約翰 | 能源部 | 人力資源 | 23 | ZZZ |
我想要的記錄是
| 名 | 姓 | 部 | 年齡 | 電話號碼 |
|---|---|---|---|---|
| 約翰 | 能源部 | 它 | 23 | 年年 |
我在#Unique 表中也有我想要的記錄。我想洗掉 3 條記錄并添加唯一表中的記錄。
uj5u.com熱心網友回復:
我仍然相信你在這里有一點 xy 問題,你最好從源頭上防止重復,而不是有一個需要由 sa 以外的人定期運行的清理程式,但要真正回答你的問題問題一個選項不是不洗掉您要保留的記錄。
如果您#Unique在洗掉之前生成表,那么您可以簡單地使用類似的東西:
SET XACT_ABORT ON;
BEGIN TRANSACTION;
UPDATE p WITH (UPDLOCK, SERIALIZABLE)
SET first_name = u.first_name,
last_name = u.last_name,
department = u.department,
age = u.age,
phone_number = u.phone_number
FROM tbl_personnel_info AS p
INNER JOIN #Unique AS u
ON u.pk_id = p.pk_id
WHERE NOT EXISTS
( SELECT u.first_name, u.last_name, u.department, u.age. u.phone_number
INTERSECT
SELECT p.first_name, p.last_name, p.department, p.age. p.phone_number
);
DELETE p
FROM tbl_personnel_info AS p
WHERE NOT EXISTS (SELECT 1 FROM #Unique AS u WHERE u.pk_id = p.pk_id);
COMMIT TRANSACTION;
這將更新您想要保留并且最初計劃重新插入的記錄(但前提是存在需要更新的值),然后僅洗掉臨時表中不存在的任何記錄。
您在這里可能面臨的一個大問題是外鍵,您可能還需要整理與您要洗掉的記錄相關的任何記錄?這是另一個原因,您最好從源頭防止重復并進行一次清理(因此不需要存盤程序)。
打個比方,你的船上有個洞,你現在的方法是抓一個水桶,不停地把水舀到船上,你將永遠這樣做,而且洞只會越來越大。這個洞現在已經很小了——所以現在是堵住它的最佳時機。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514579.html
