web-dev-qa-db-fra.com

Mise à jour depuis la table temporaire

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:

  1. Une raison pour laquelle tous les enregistrements obtiennent le HomeAddress sur Table1?
  2. Le curseur est-il vraiment le seul moyen de mettre à jour la valeur sur Table1?
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

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
22
HLGEM

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) 

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

- Notez que les 'GO' sont importants pour préserver le contexte dans SQL Server 2017, sinon vous trouverez une erreur 'Nom du champ inconnu'.

0