我可以在行版本上选择行吗?
我定期查询数据库表以查找新行。 我想存储最后一行版本,然后从先前存储的行版本中读取所有行。
我无法向表中添加任何内容,PK不是按顺序生成的,也没有日期字段。
还有其他方法可以获取自上次查询以来新增的所有行吗?
我正在创建一个新表,其中包含已处理的行的所有主键,并将在该表上连接以获取新行,但我想知道是否有更好的方法。
修改
这是表结构:
除product_id和stock_code之外的所有内容都是描述产品的字段。
答案 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
命令似乎就是您所需要的:
请注意,您的临时表只需包含您需要的密钥。如果这只是一列,您可以使用NOT IN
而不是EXCEPT
。