我有一个只有3列的SQL Server表,其中一列是varbinary类型。此列中的数据实际上是一个Json文档,其中包含有关上次修改数据的时间的信息。不幸的是,SQL表本身不包含有关何时修改其行的信息。
现在,在对数据进行排序和过滤时,我当然不想获取所有行以便查找例如最新的100个条目。
所以我的问题是:SQL Server是否记得何时添加/修改了一行?我已经尝试添加时间戳,这适用于所有现有的行,但我认为这是随机应用的,因为排序不起作用。我不需要日期时间或任何事情,我只想根据上次修改时间对记录进行排序。
由于
答案 0 :(得分:0)
每次进行插入时,使用新列CreatedDate并存储日期时间。
您可以使用GetDate()在列中插入日期。
UpdatedDate列可用于更新。
答案 1 :(得分:0)
以便找到例如最新的100个条目。 时间戳确实是你需要的。
它的价值不断增加,它会自动更新,因此您始终可以找到所有上次修改/插入的行。
以下是一个例子:
create table dbo.test1 (id int);
insert into dbo.test1 values(1), (2), (3);
alter table dbo.test1 add ts timestamp;
update dbo.test1
set id = 10
where id = 2
select top 1 *
from dbo.test1
order by ts desc;
--id ts
--10 0x000000001FCFABD2
insert into dbo.test1 (id)
values (100);
select top 1 *
from dbo.test1
order by ts desc;
--id ts
--100 0x000000001FCFABD3
如您所见,您始终会获得最后修改/插入的行。
出于您的目的,只需使用
select top 100 *
...
order by ts desc;
答案 2 :(得分:0)
感谢。显然我在发布这个问题之前看起来不够努力。这个问题之前已被问过几次,答案是:不!对此没有简单的解决方案。
SQL Server不会跟踪创建或修改记录的时间,这正是我所寻找的。所以我将寻找下一个最佳解决方案,可能是创建一个datetime列,从Json文档中检索修改日期,然后更新记录。或者更确切地说,有1,400万条记录: - (
答案 3 :(得分:0)
当插入或修改行时,SQL Server将无法跟踪历史记录,因此您需要依赖JSON数据来自行计算。您将需要一个新列来提高查询效率。获得新列后,您可以选择以下选项:
使用JSON数据中的相关值循环填充新列的所有记录。
如果您的SQL Server版本足够新,可以query the JSON data directly。使用如下查询填充此列:
UPDATE MyTable
SET MyNewColumn = JSON_VALUE(JsonDataColumn, '$.Customer.DateCreated')
这种方法的缺点是你需要保持这个
让SQL Server自动计算JSON中的值,例如:
ALTER TABLE MyTable
ADD MyNewColumn AS JSON_VALUE(JsonDataColumn, '$.Customer.DateCreated')
并创建一个索引以提高效率:
CREATE INDEX IX_MyTable_MyNewColumn
ON MyTable(MyNewColumn)
答案 4 :(得分:0)
对于希望将DateTime类型的tamestamp列插入现有数据库表中的用户,您可以这样做:
(pointer, capacity, length)
现有记录将自动获得等于添加列时的日期/时间的值。 新记录将在插入时获得最新的值。