我在Single表中应用了12Lac Insert命令,
但经过一段时间查询终止后,我怎么能找到Last
插入记录
a)表没有创建日期列
b)不能应用order by子句,因为主键值是手动生成的
c)在mssql中,Last()不是buit。
或以任何方式查找上次执行的查询
会有一些方法,但无法弄清楚
表仅包含主键约束无其他约束
答案 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
此示例输出如下所示:
你可以order by __$seqval
给你一个插入行的顺序。
注意:SQL Server Express