我有一个要求,其中涉及两个主要表,一个是暂存表 - 来自其他源 RDBMS 的 DLSTYTOTAL 数据,另一个表是分区表 -STYTOTAL_RAW,我们正在其中加载传入数据。
- 从源分区表自动生成下一个标识值
为了进行分区,我创建了另一个暂存表 - STYTOTAL_RAW_Intermediate_Staging。因为 DLSTYTOTAL 表不包含所有列,特别是标识列和分区键列。
主暂存表有 1000 多万条数据。我想过每次删除时使用 select * into 并将其创建为分区暂存表,然后切换到分区表。问题是我无法获得正确的 IDENTITY 值,因为它每次都会重置。我想过从分区表 STYTOTAL_RAW 中取最大值加 1。但是 select IDENTITY(INT,@IDENTITY_no_max ,1) AS [STYTOTALID] 不接受变量
declare @IDENTITY_no_max bigint
select max([STYTOTALID]) as [Original_max] from STYTOTAL_RAW -- original max value
select @IDENTITY_no_max= max([STYTOTALID]+1) from STYTOTAL_RAW
select @IDENTITY_no_max as [@IDENTITY_no_max]
select IDENTITY(INT,1,@IDENTITY_no_max) AS [STYTOTALID],ISNULL([STYLE],0) [STYLE],DATEADD(MICROSECOND, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), SYSDATETIME()) [InsertedDateTime],
CAST(1 AS bit) as [IsCurrent],[DELDATTIM],[DELFLAG]
into [STYTOTAL_RAW_Intermediate_Staging] from [C1810429].[DLSTYTOTAL]
将日期列 [InsertedDateTime] 从 select * 更改为其自身,使其不为空。
选择 DATEADD(MICROSECOND, ROW_NUMBER() OVER (ORDER BY ( SELECT NULL)), isnull(SYSDATETIME(),'1900-01-01 00:00:00.000') ) [InsertedDateTime] 进入 tbl_date_not_null sp_help'tbl_date_not_null'
有没有办法始终从源表中获取标识值并填充到暂存中。此外,是否可以在 select * 中将日期列更改为 not null,而不是 alter table with not null。
感谢您的帮助。
在此处添加脚本:https://dbfiddle.uk/uaMhsB4k
我认为第一个问题是 - 如何获取类似
IDENTITY
但具有特定起始值的序列值。如果我的理解正确,并且这些值仅由您生成,您可以尝试使用Sequence Numbers
。第二个问题,为什么不
CRAETE TABLE
使用INSERT INTO... SELECT...