【问题标题】:Select on Row Version选择行版本
【发布时间】:2013-10-15 00:00:42
【问题描述】:

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

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

我不能往表中添加任何东西,PK不是顺序生成的,也没有日期字段。

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

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

编辑

这是表结构:

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

【问题讨论】:

  • 你不能改变你的表架构吗?
  • 没有。这不是我的桌子;我只是从中提取行。

标签: sql sql-server


【解决方案1】:

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

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

示例代码(在 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 Change Data Capture 将是我能想到的唯一符合要求的东西:http://technet.microsoft.com/en-us/library/bb500353(v=sql.105).aspx

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

【讨论】:

  • 请发布一些sql来选择rowversion
  • @Bvrce 祝你好运。
  • 谢谢;是否必须声明 ROWVERSION 列?只有当它是列时才能使用 ROWVERSION 吗?问题是我无法创建新列。
  • @Bvrce 您说该表在您的问题中有一个行版本列?可以?发布表模式,让我们看看你正在使用什么:)
  • 我已经发布了架构。没有 ROWVERSION 列;我希望 ROWVERSION 仍然可以使用。
【解决方案2】:

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

  1. 将您的表复制到临时表中。
  2. 下次您查看时,从您的表中选择所有内容,除了临时表中的所有内容,从中提取您需要的键
  3. 确保您的临时表再次保持最新状态。

请注意,您的临时表只需要包含您需要的键。如果这只是一列,您可以选择 NOT IN 而不是 EXCEPT

【讨论】:

  • 我将从这里使用左外连接:stackoverflow.com/questions/4076098/…
  • 我只是创建一列,其中包含所有已处理的 product_id。上面的左外连接合适吗?
  • @Bvrce 我认为您可以使用它,但是对于仅 1 列,可以更简单地找到尚未处理的列。比如:Select id from t1 where id not in (select id from t2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多