Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

UNISCI NELL'ordine di inserzione

Non posso parlare di ciò che l'interrogante sta chiedendo qui perché non ne fa nessuno senso.

Ipotizziamo quindi un problema diverso:

Diciamo, invece, che ho una Heap-Table senza Identity-Field, ma ha un "Visitato " Campo della data.
The Heap-Table registra le visite alla pagina Web della persona e la sto caricando nel mio Data Warehouse.
In questo Data Warehouse vorrei utilizzare la chiave surrogata "WebHitID " per fare riferimento a queste relazioni.
Utilizziamo Unisci per eseguire il caricamento iniziale della tabella, quindi continuiamo a chiamarla per mantenere sincronizzate le tabelle.

So che se inserisco record in una tabella, quindi preferirei che gli ID (che vengono generati da un campo di identificazione) siano sequenziali in base a qualsiasi ordine scelgo (diciamo "Visitato " Data).
Non è raro aspettarsi che un ID intero sia correlato a quando è stato creato rispetto al resto dei record nella tabella.
So che non è sempre così al 100% , ma assecondami per un momento.

Questo è possibile con Unisci.

Utilizzando (quello che sembra un hack ) TOP consentirà l'ordinamento nel nostro inserto:

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.
;


Puoi vedere che ho scelto di utilizzare TOP 9223372036854775807 (il numero intero più grande che c'è) per estrarre tutto.
Se hai le risorse per unire più di quello, dovresti eliminarlo.
Mentre questo urla "soluzione hacky " per me, dovrebbe portarti dove devi andare.

L'ho testato su un piccolo set di campioni e verificato che funziona. Non ho studiato l'impatto sulle prestazioni su set complessi più grandi di dati però, quindi YMMV con e senza TOP.