Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

MERGE INTO pedido de inserção


Não posso falar sobre o que o Questionador está pedindo aqui porque não faz nenhum senso.

Então, vamos supor um problema diferente:


Digamos, em vez disso, que eu tenha uma Heap-Table sem Identity-Field, mas ela tenha um "Visitado " Campo de data.
A Heap-Table registra as visitas à página da Web da pessoa e estou carregando-a no meu Data Warehouse.
Neste Data Warehouse eu gostaria de usar a Surrogate-Key "WebHitID " para fazer referência a esses relacionamentos.
Vamos usar o Merge para fazer o carregamento inicial da tabela e continuar chamando-o para manter as tabelas sincronizadas.

Eu sei que se estou inserindo registros em uma tabela, então eu preferiria que os IDs (que estão sendo gerados por um campo de identificação) sejam sequenciais com base em qualquer Ordem por que eu escolher (digamos, o "Visitado " Data).
Não é incomum esperar que um Integer-ID se correlacione com o momento em que foi criado em relação ao restante dos registros na tabela.
Sei ​​que nem sempre é 100% o caso , mas me divirta por um momento.

Isso é possível com Mesclar.


Usando (o que parece um hack ) TOP permitirá a Ordenação em nossa Inserção:
MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
    SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
           PWV.PersonID, PWV.WebPageID, PWV.Visited
      FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
     ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
  ON Source.PersonID  = Target.PersonID
 AND Source.WebPageID = Target.WebPageID
 AND Source.Visited   = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
    INSERT (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
    VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
    DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;


Você pode ver que eu optei por usar o TOP 9223372036854775807 (o maior Integer que existe) para puxar tudo.
Se você tiver os recursos para mesclar mais do que isso, então você deve separar.
Enquanto isso grita "solução hackeada " para mim, ele deve levá-lo aonde você precisa ir.

Eu testei isso em um pequeno conjunto de amostras e verifiquei que funciona. Eu não estudei o impacto no desempenho dele em conjuntos complexos maiores de dados, portanto, YMMV com e sem o TOP.