2013-10-08 102 views
2

我可以在行版本上選擇行嗎?選擇行版本

我正在定期查詢數據庫表中的新行。 我想存儲最後一行版本,然後讀取先前存儲的行版本中的所有行。

我無法添加任何東西到表中,PK不會順序生成,並且沒有日期字段。

是否有任何其他方式來獲取自上次查詢以來新增的所有行?

我正在創建一個新表,其中包含已處理的行的所有主鍵,並將在該表上加入以獲取新行,但我想知道是否有更好的方法。

EDIT

這是表的結構:除了PRODUCT_ID和stock_code

enter image description here

一切是描述產品領域。

+0

你不能改變你的表格模式嗎? – Kaf

+0

不是,這不是我的桌子;我只是從中拉行。 – Bvrce

回答

3

您可以將rowversion轉換爲bigint,然後當您再次讀取行時,將該列轉換爲bigint並與先前存儲的值進行比較。這種方法的問題是每次選擇基於rowversion轉換時的表掃描 - 如果源表很大,這可能會很慢。

我還沒有嘗試過這個持久化的計算列,我很想知道它是否工作正常。

示例代碼(在SQL Server 2008 R2測試):

DECLARE @TABLE TABLE 
(
    Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Data VARCHAR(10) NOT NULL, 
    LastChanged ROWVERSION NOT NULL 
) 

INSERT INTO @TABLE(Data) 
VALUES('Hello'), ('World') 

SELECT 
    Id, 
    Data, 
    LastChanged, 
    CAST(LastChanged AS BIGINT) 
FROM 
    @TABLE 

DECLARE @Latest BIGINT = (SELECT MAX(CAST(LastChanged AS BIGINT)) FROM @TABLE) 

SELECT * FROM @TABLE WHERE CAST(LastChanged AS BIGINT) >= @Latest 

編輯:看來我誤解,你實際上並沒有一個ROWVERSION列,你剛纔提到的行版本作爲一個概念。在這種情況下,SQL Server Change Data Capture將是我能想到的唯一符合法案的事情:http://technet.microsoft.com/en-us/library/bb500353(v=sql.105).aspx

不確定這是否符合您的需求,因爲您需要能夠存儲LSN 「上次查看時間」,以便您可以正確查詢CDC表。它更適合於數據加載而不是典型查詢。

+0

請發佈一些sql來選擇rowversion – Bvrce

+0

@Brrce在那裏你去,祝你好運。 – Meff

+0

謝謝;是否必須聲明ROWVERSION列? ROWVERSION只能用於列嗎?問題是我無法創建一個新列。 – Bvrce

1

假設你可以創建一個臨時表中,EXCEPT命令似乎是你所需要的:

  1. 你的表複製到一個臨時表。
  2. 下一次你看,從你的表中選擇一切除了臨時表中的所有東西,從這個
  3. 中提取你需要的密鑰確保你的臨時表是最新的。

請注意,臨時表只需包含所需的密鑰。如果這只是一列,你可以去NOT IN而不是EXCEPT

+0

我要從左邊的外部連接從這裏:http://stackoverflow.com/questions/4076098/how-to-select-rows-with-no-matching-entry-in-another-table – Bvrce

+0

我只是創建一列包含所有已處理的product_id。上面的左外連接是否合適? – Bvrce

+1

@Brrce我認爲你可以使用它,但對於只有1列,可以更簡單地找到那些尚未處理的。例如:'從t1中選擇id,其中id不在(從t2中選擇id)'' –