Question:
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)
Je dois principalement copier les données OUT d'un champ XML dans des champs normaux de la même table.
Des questions:
UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on T1.ID = t2.HomeAddressID
and t2.HomeAddress <> t1.address
Utilisez une jointure. Pas besoin de table temporaire ou de sous-requête corrélée.
Si la table 1 est dans une relation un à plusieurs, ce sont quelques possibilités pour gérer cela. Si vous avez une valeur qui indique un et un seul enregistrement (nous avons un champ dans notre système qui sélectionne l'adresse la plus importante, il est maintenu avec un déclencheur pour garantir l'unicité), essayez ceci:
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
Si vous devez baser l'enregistrement unique sur un autre champ (comme la date la plus récente), essayez une variante:
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
Lors de la mise à jour, je dois COMPLETER TOTALEMENT le tableau comme suit:
UPDATE TABLE1
SET TABLE1.HomeAddress = (SELECT TOP 1 t.Address
DE #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
- Notez que les 'GO' sont importants pour préserver le contexte dans SQL Server 2017, sinon vous trouverez une erreur 'Nom du champ inconnu'.