Comment puis-je obtenir les ID des lignes concernées lors de ma mise à jour par lots? Comme j'essaye d'insérer sur la table tbl.history de toutes les mises à jour / transactions.

Voici mon exemple de tableau:

table tbl.myTable
+------+-----------+------------+
|  ID  |   Amount  |    Date    |
+------+-----------+------------+
|  1   |    100    | 01/01/2019 |
+------+-----------+------------+
|  2   |    200    | 01/02/2019 |
+------+-----------+------------+  
|  3   |    500    | 01/01/2019 |
+------+-----------+------------+  
|  5   |    500    | 01/05/2019 |
+------+-----------+------------+   

Voici ma requête de mise à jour par lots:

Update tbl.myTable set Amount = 0 where Date = '01/01/2019'

Avec la requête, il mettra à jour / affectera les deux données avec les ID 1 et 3. Comment puis-je obtenir ces ID pour les insérer dans une autre table (tbl.history)?

2
Richard 20 juin 2019 à 09:03

3 réponses

Meilleure réponse

Utilisez le OUTPUT Clause. Il vous fournit une "table" nommée deleted qui contient les valeurs avant la mise à jour, et une "table" nommée inserted qui contient les nouvelles valeurs.

Alors tu peux courir

Update tbl.myTable set Amount = 0
output inserted.*,deleted.*
where Date = '01/01/2019'

Pour comprendre comment cela fonctionne, après cela, vous pouvez maintenant créer une table temporaire et OUTPUT les champs que vous voulez INTO:

Update tbl.myTable set Amount = 0
output inserted.*,deleted.* into temp_table_with_updated
where Date = '01/01/2019'
5
Koby Douek 20 juin 2019 à 06:17

Vous pouvez le faire en utilisant OUTPUT

declare @outputIDs as TABLE
(
   ID int
)

Update tbl.MyTable Set [Amount] = 0
OUTPUT INSERTED.ID into @outputIDs
WHERE [Date] = '01/01/2019'

La table @outputIDs aura les deux ID mis à jour.

1
Matt 20 juin 2019 à 06:16

Utilisez un mécanisme de mise en cache (variable de table, cte, etc.)

declare @temp table (id int)
insert into @temp select id from tbl.myTable where Date = '01/01/2019'
update tbl.myTable set Amount=0 where id in (select id from @temp)
-- do more stuff with the id's
0
Programnik 20 juin 2019 à 06:12