Tenho um requisito em que há duas tabelas principais envolvidas: uma é a tabela de preparação - dados DLSTYTOTAL vindos de outro RDBMS de origem e a outra é a tabela particionada - STYTOTAL_RAW, onde estamos carregando os dados de entrada.
- Gerar automaticamente o próximo valor de identidade da tabela particionada de origem
Para fazer a partição, criei mais uma tabela de preparação chamada - STYTOTAL_RAW_Intermediate_Staging. Já que a tabela DLSTYTOTAL não tem todas as colunas, particularmente a coluna de identidade e as colunas de chave de partição.
A tabela de preparação principal obtém 10 milhões + dados. Pensei em usar select * into com cada queda de tempo e criá-la na tabela de preparação de partição e então alternar para a tabela de partição. O problema é que não consegui obter o valor IDENTITY correto, pois ele era redefinido a cada vez. Pensei em pegar o valor máximo mais 1 da tabela de partição - STYTOTAL_RAW. Mas select IDENTITY(INT,@IDENTITY_no_max ,1) AS [STYTOTALID] isso não está aceitando variável
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]
Alterar a coluna de data [InsertedDateTime] para não nula do select * para si mesma.
selecione DATEADD(MICROSEGUNDO, NÚMERO_DA_LINHA() SOBRE (ORDEM POR (SELECIONE NULO)), é nulo(SYSDATETIME(),'1900-01-01 00:00:00.000') ) [Data_Hora_Inserida] em tbl_date_not_null sp_help 'tbl_date_not_null'
Existe alguma maneira de obter o valor de identidade o tempo todo da tabela de origem e preencher para staging . Também é possível alterar a coluna de data para not null no select * em si mesmo em vez de alter table com not null.
Obrigado pela ajuda.
Adicionando o script aqui: https://dbfiddle.uk/uaMhsB4k
Acho que a primeira pergunta é - Como obter um valor de sequência que seja parecido
IDENTITY
, mas com um valor inicial específico. Se meu entendimento estiver correto, e os valores forem gerados somente por você, você pode tentar usarSequence Numbers
.A segunda pergunta, por que não usar
CRAETE TABLE
eINSERT INTO... SELECT...