其中一个表必须是产品代表及其分配区域的层次结构。 Orese代表及其区域每天都在变化,我需要跟踪该桌子每天的确切状况。我将需要每天对该表进行快照。我想知道我该怎么做或必须如何将数据存储在表中,以便能够准确地知道某个时间点表中的数据是什么。这可能吗?请记住,表的大小不能超过1 MB,并且表具有增量负载。我不想使用任何工具。我只想在存储的proc中为其构建逻辑。
答案 0 :(得分:1)
您可以执行以下操作之一:
我的个人喜好是最后一个选择,但前两个可能对您来说更容易。
对于前两个选项,您需要创建一个SQL Server Agent作业以每晚运行并拍摄快照。第三个选项会自动运行。
可以说您的表名为MyTable
,具有主键ID int
和字段Name varchar(50)
。
对于第一个选项,您需要使用动态SQL,因为每次新表的名称都会不同:
declare @sql nvarchar(max) = N'select ID, Name into MyTable_' +
convert(nvarchar(10), getdate(), 112) + N' from MyTable'
exec (@sql)
执行时,此语句将创建一个新表,该表的结构与现有表相同,但以当前日期作为后缀命名,例如MyTable_20190116
,然后将MyTable
复制到其中。
对于第二个选项,您需要创建一个像波纹管这样的表,并使用如下脚本将数据复制到该表中:
create table MyTableDailySnapshots(
SnapshotDate date not null
, ID int not null
, Name varchar(50)
, constraint PK_MyTableDailySnapshots primary key clustered (SnapshotDate, ID)
)
insert into MyTableDailySnapshots(SnapshotDate, ID, Name)
select GETDATE(), ID, Name
from MyTable
如果选择第三个选项,则无需采取任何措施来维护快照。只需使用这样的查询,即可获得一段时间的表状态:
select ID, Name from MyTable
for system_time between '2019-01-16 00:00:00.0000000' and '2019-01-16 23:59:59.9999999'
如果表的架构随时间变化,则第一个选项更加灵活,因为您每天都可以创建具有不同架构的表。选项2和3仅具有1个表来存储快照,因此,如果需要更改表的架构,则可能需要具有创造力。但是第一种选择的缺点是在数据库中创建了大量的表。
因此,由您自行决定最适合您的情况。