在行版本上选择

时间:2013-10-08 07:11:26

标签: sql sql-server

我可以在行版本上选择行吗?

我定期查询数据库表以查找新行。 我想存储最后一行版本,然后从先前存储的行版本中读取所有行。

我无法向表中添加任何内容,PK不是按顺序生成的,也没有日期字段。

还有其他方法可以获取自上次查询以来新增的所有行吗?

我正在创建一个新表,其中包含已处理的行的所有主键,并将在该表上连接以获取新行,但我想知道是否有更好的方法。

修改

这是表结构:

enter image description here

除product_id和stock_code之外的所有内容都是描述产品的字段。

2 个答案:

答案 0 :(得分:3)

您可以将rowversion转换为bigint,然后当您再次读取行时,将列转换为bigint并与之前的存储值进行比较。这种方法的问题是每次根据rowversion的强制转换进行选择时的表扫描 - 如果源表很大,这可能会很慢。

我还没有尝试过这个持久的计算列,我很想知道它是否运行良好。

示例代码(在SQL Server 2008R2中测试):

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变更数据捕获将是我能想到的唯一适合该法案的东西:http://technet.microsoft.com/en-us/library/bb500353(v=sql.105).aspx

不确定这是否符合您的需求,因为您需要能够存储“您上次查看”的LSN,以便您可以正确查询CDC表。与典型的查询相比,它更适合数据加载。

答案 1 :(得分:1)

假设您可以创建临时表,EXCEPT命令似乎就是您所需要的:

  1. 将您的表复制到临时表中。
  2. 下次看时,从表中选择所有内容除了临时表中的所有内容,从中提取所需的密钥
  3. 确保您的临时表格再次更新。
  4. 请注意,您的临时表只需包含您需要的密钥。如果这只是一列,您可以使用NOT IN而不是EXCEPT