wake-up-neo.net

Update von der Temp-Tabelle

Abfrage:

SELECT ID, T.c.value('@Address', 'nvarchar(20)' ) as Address
INTO #TMP
FROM TABLE1
    CROSS APPLY XMLData.nodes('/Document') AS T(c)

UPDATE TABLE1
SET HomeAddress = (SELECT TOP 1 t.Address
                   FROM #TMP t
                   WHERE t.ID = ID)

Hauptsächlich muss ich Daten OUT aus einem XML-Feld in normale Felder in derselben Tabelle kopieren. 

Fragen:

  1. Gibt es einen Grund, warum alle Datensätze die HomeAddress auf Table1 erhalten?
  2. Ist wirklich Cursor der einzige Weg, um den Wert in Tabelle1 zu aktualisieren?
11
SF Developer
UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on T1.ID = t2.HomeAddressID
and t2.HomeAddress <> t1.address

Verwenden Sie einen Join. Keine temporäre Tabelle oder korrelierte Unterabfrage.

Wenn Tabelle 1 in einer zu vielen Beziehung steht, gibt es einige Möglichkeiten, dies zu handhaben. Wenn Sie einen Wert haben, der nur einen Datensatz angibt (wir haben ein Feld in unserem System, das die wichtigste Adresse auswählt, wird es mit einem Auslöser gepflegt, um die Einzigartigkeit zu gewährleisten), versuchen Sie Folgendes:

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
WHERE t1.somefield = 'somevalue'
and t2.HomeAddress <> t1.address

Wenn Sie den eindeutigen Datensatz auf einem anderen Feld basieren müssen (z. B. auf dem neuesten Datum), versuchen Sie es mit einer Variation davon:

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
join (select id, max(somedatefield) from  table1 group by id) t3 on t3.id = t1.id
Where  t2.HomeAddress <> t1.address
22
HLGEM

Beim Update muss ich die Tabelle VOLLSTÄNDIG QUALIFIZIEREN:

UPDATE TABLE1
SET TABLE1.HomeAddress = (SELECT TOP 1 t.Adresse
FROM #TMP t
WHERE t.ID = TABLE1.ID) 

2
SF Developer
SELECT P.TipoComprob,P.NoComprob,C.Importe as ImpIVA1,ROUND(100/P.ImpGravado*C.Importe,1)
 as PorcIVA1 
       INTO #Temporal
       FROM ComprobProv AS P
       LEFT JOIN PasesCompras AS C ON C.TipoComprob=P.TipoAsiento AND 
C.NoComprob=P.NoComprob
WHERE P.PorcIVA1 =0 and P.CatIVA = 'Ri' AND P.ImpGravado>0 AND C.CodCuenta=110303010 AND ROUND(100/P.ImpGravado*C.Importe,1) IN (21.00,10.50,27.00);
go

select * from #Temporal;
go

UPDATE 
   t1 
SET 
   t1.ImpIVA1 =  t2.ImpIVA1, t1.PorcIVA1 = t2.PorcIVA1
FROM
   dbo.ComprobProv t1
   INNER JOIN #Temporal t2
   ON t1.TipoComprob = t2.TipoComprob AND t1.NoComprob = t2.NoComprob;
go

- Beachten Sie, dass 'GO' wichtig ist, um den Kontext in SQL Server 2017 zu erhalten. Andernfalls wird ein Fehler 'Unbekannter Feldname' angezeigt.