查找上次插入的记录MS SQL SERVER

时间:2014-03-19 11:40:46

标签: sql sql-server-2008

我在Single表中应用了12Lac Insert命令, 但经过一段时间查询终止后,我怎么能找到Last 插入记录
a)表没有创建日期列
b)不能应用order by子句,因为主键值是手动生成的 c)在mssql中,Last()不是buit。

或以任何方式查找上次执行的查询
会有一些方法,但无法弄清楚

表仅包含主键约束无其他约束

2 个答案:

答案 0 :(得分:1)

根据评论请求,这是一个快速而肮脏的手动解决方案,假设您已获得INSERT语句列表(或相应数据),其顺序与发布的INSERT相同。对于这个例子,我假设有100万条记录。

INSERT ... VALUES (1, ...)
...
INSERT ... VALUES (250000, ...)
...
INSERT ... VALUES (500000, ...)
...
INSERT ... VALUES (750000, ...)
...
INSERT ... VALUES (1000000, ...)

您必须找到已插入的最后一个PK。幸运的是,在这种情况下有一个。因此,您开始在发布表格中进行手动二进制搜索

SELECT pk FROM myTable WHERE pk = 500000

如果你收到一排,你知道它到目前为止。继续使用pk = 750000进行核对。然后再次,如果它与pk = 875000一起。如果不存在750000,则INSERT必须先停止。然后检查pk = 675000。在这种情况下,此过程在20个步骤后停止。

这只是简单的手动划分和征服。

答案 1 :(得分:0)

有一种方法。 不幸的是,你必须提前做到这一点,所以它可以帮助你。 因此,如果您有任何机会插入PRIMARY KEYS,仍然可以继续操作并删除具有这些键的所有行:

DELETE FROM tableName WHERE ID IN (id1, id2, ...., idn)

然后为数据库启用Change Data Capture(已选择数据库):

EXEC sys.sp_cdc_enable_db;

现在您还需要为该表启用更改数据捕获,在我尝试过的示例中我可以运行:

EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'tableName', @role_name = null

现在你几乎已经安装好了!您需要查看系统服务并验证SQL Server Agent是否正在为您的DBMS运行,如果它没有捕获则不会发生。

现在,当您在表格中插入内容时,可以从名为[cdc].[dbo_tableName_CT]的新表中选择数据更改:

SELECT [__$start_lsn]
      ,[__$end_lsn]
      ,[__$seqval]
      ,[__$operation]
      ,[__$update_mask]
      ,[ID]
      ,[Value]
  FROM [cdc].[dbo_tableName_CT]
GO

此示例输出如下所示:

enter image description here

你可以order by __$seqval给你一个插入行的顺序。

注意:SQL Server Express

中似乎没有此功能