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:
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
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)
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.