Sql 选择行上版本

Sql 选择行上版本,sql,sql-server,Sql,Sql Server,我可以按行版本选择行吗 我定期查询数据库表以查找新行。 我想存储最后一行版本,然后从以前存储的行版本中读取所有行 我无法向表中添加任何内容,PK不是按顺序生成的,并且没有日期字段 是否有其他方法可以获取自上次查询以来的所有新行 我正在创建一个新表,其中包含已处理行的所有主键,并将在该表上联接以获取新行,但我想知道是否有更好的方法 编辑 这是表结构: 除了产品id和库存代码之外的所有内容都是描述产品的字段。您可以将行版本转换为bigint,然后在再次读取行时,将列转换为bigint,并与以前存储

我可以按行版本选择行吗

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

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

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

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

编辑

这是表结构:


除了产品id和库存代码之外的所有内容都是描述产品的字段。

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

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

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

编辑:看来我误解了,实际上您没有ROWVERSION列,您只是提到了ROWVERSION作为一个概念。在这种情况下,SQL Server变更数据捕获将是我能想到的唯一符合要求的东西:


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

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

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

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

编辑:看来我误解了,实际上您没有ROWVERSION列,您只是提到了ROWVERSION作为一个概念。在这种情况下,SQL Server变更数据捕获将是我能想到的唯一符合要求的东西:


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

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

  • 将表复制到临时表中
  • 下次查看时,从表中选择除临时表之外的所有内容,从该表中提取所需的键
  • 确保您的临时表再次处于最新状态

  • 请注意,临时表只需要包含所需的键。如果这只是一列,您可以选择
    不在
    中,而不是
    除了

    假设您可以创建一个临时表,那么该命令似乎就是您所需要的:

  • 将表复制到临时表中
  • 下次查看时,从表中选择除临时表之外的所有内容,从该表中提取所需的键
  • 确保您的临时表再次处于最新状态


  • 请注意,临时表只需要包含所需的键。如果这只是一列,您可以选择一个
    不在
    中,而不是
    除了

    之外,您不能更改您的表架构吗?不,它不是我的表;我只是从中提取行。您不能更改您的表模式吗?不,它不是我的表;我只是从中提取行。请发布一些sql来选择rowversion@Bvrce好了,祝你好运。谢谢你;是否必须声明ROWVERSION列?ROWVERSION只能在列中使用吗?问题是我无法创建一个新列。@Bvrce您说过表中有行版本列吗?是吗?发布表模式,让我们看看您正在使用什么:)我已经发布了模式。没有行版本列;我希望ROWVERSION仍然可以使用。请发布一些sql来选择rowversion@Bvrce好了,祝你好运。谢谢你;是否必须声明ROWVERSION列?ROWVERSION只能在列中使用吗?问题是我无法创建一个新列。@Bvrce您说过表中有行版本列吗?是吗?发布表模式,让我们看看您正在使用什么:)我已经发布了模式。没有行版本列;我希望ROWVERSION仍然可以使用。我将从这里使用一个左外连接:我只是创建一个列,其中包含所有已处理的产品标识。上面左边的外部联接是否合适?@Bvrce我认为您可以使用它,但对于仅1列,查找尚未处理的列要简单得多。类似于:
    从t1中选择id,其中id不在(从t2中选择id)
    我将从这里使用一个左外部联接:我只是创建一个列,其中包含所有已处理的产品id。上面左边的外部联接是否合适?@Bvrce我认为您可以使用它,但对于仅1列,查找尚未处理的列要简单得多。类似于:
    从t1中选择id,其中id不在(从t2中选择id)
    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