Sql-Server

挑戰僅選擇自上次 SELECT 以來添加的新記錄

  • January 6, 2021

前段時間我遇到了一個我誤解的問題/問題,因為使用者不是很熟練,我繼續以最醜陋,cthullu,混亂的方式解決它。現在,如果這裡不適合分享有趣的創造力練習,我深表歉意。

問題是:

當執行語句select * from temp1時,僅返回自執行最後一個****select語句以來添加的那些行。沒有WHERE條件/加入等。僅從**temp1 中選擇 ***

DDL:

create table temp1 (
 id int identity primary key, 
 Location varchar(4), 
 SupplierId tinyint
)

在這裡你可以做你需要做的事情來解決挑戰

之後應該執行什麼**(沒有刪除、更新或 DDL 語句)**:

insert into temp1 select 'ABCD', 4
insert into temp1 select 'DEFG', 5
select * from temp1

返回

1, ‘ABCD’, 4

2, ‘DEFG’, 5

然後執行

insert into temp1 select 'TRYE', 7

select * from temp1

僅返回 3, ‘TRYE’, 7

祝你好運,如果你以任何其他方式做類似的事情而不是為了好玩,願上帝憐憫你的靈魂:D

我已經刪除了我的第一個答案(參見這裡的小提琴),因為它讓我從一些 shpxre(*) 中得到了一個-1!無論如何,嘗試,嘗試,再試一次!…

您似乎想要“不勞而獲”,因為您希望系統通過“普通”RDBMS 執行通常不可能完成的事情,但您希望這是自動的。除非關係範式和生產關係數據庫的人所採用的方法發生了翻天覆地的變化,否則您想要的功能將仍然不可用!

但是,有一種(部分)可行的解決方法,我可以想到您可以使用(參見 fiddle here)。

CREATE TABLE temp2
(
 id INT IDENTITY PRIMARY KEY, 
 location VARCHAR (4) NOT NULL, 
 supplier_id TINYINT NOT NULL,
 trans_id BIGINT NOT NULL,

);

填充它(將INSERTs 放入事務的原因將在下面討論):

BEGIN TRANSACTION;
INSERT INTO temp2 (location, supplier_id, trans_id) 
 SELECT 'ABCD', 4, CURRENT_TRANSACTION_ID ();
INSERT INTO temp2 (location, supplier_id, trans_id) 
 SELECT 'DEFG', 5, CURRENT_TRANSACTION_ID ();
COMMIT;

查看:

SELECT * FROM temp2;

結果:

id  location    supplier_id trans_id    trans_time
1      ABCD              4 47235270    2021-01-04 20:20:23.737
2      DEFG              5 47235270    2021-01-04 20:20:23.737

因此,現在針對您的特定要求的我的解決方案版本(也許您想告訴我們為什麼,確切地說,您要這樣做?):

我們因此創建了第二個temp2_to_permanent

CREATE TABLE temp2_to_permanent
(
 id INT PRIMARY KEY, 
 location varchar(4) NOT NULL, 
 supplier_id tinyint NOT NULL,
 trans_id BIGINT NOT NULL,
 trans_time DATETIME
);

現在,我們將另一條記錄添加到temp2

BEGIN TRANSACTION;
INSERT INTO temp2_to_permanent SELECT * FROM temp2;
DELETE FROM temp2;
INSERT INTO temp2  (location, supplier_id, trans_id) 
 SELECT 'TRYE', 7, CURRENT_TRANSACTION_ID();
COMMIT;

你們中眼光敏銳的人會注意到,我所做的不僅僅是INSERT錄製唱片——我所做的是:

  • INSERT將內容編temp2temp2_to_permanent
  • DELETED所有記錄來自temp2- 注意,不是TRUNCATE因為這會失敗 - 您顯然不能在 SQL Server 的事務中使用 DDL
  • INSERT將新記錄編入temp2

然後,我們發出第二個

SELECT * FROM temp2;

結果:

id  location    supplier_id trans_id    trans_time
3      TRYE              7 47238800    2021-01-04 20:30:52.513

現在,所有這些都可以包含在一個TRIGGER(不是 SQL Server 人——我把這留給讀者)。

但是有一個警告,如果其他使用者INSERT在同一時間或大約在同一時間 ing,那麼他們的記錄可能會與您的記錄交錯 - 即他們也可能在從表中ing和ingINSERT之間的時間內編輯不同的記錄- 。COMMIT``INSERT``SELECT``Ye cannae beet the laws o' physics, Jim!"

(*) 通過此站點執行 shpxre 。

變更數據擷取是專門為此設計的。它將進一步的表添加到數據庫和其他元數據項。消費者必須跟踪它所看到的變化。

我在我目前的項目中使用它來將更改從 OLTP 系統拉入數據倉庫。

引用自:https://dba.stackexchange.com/questions/282516