web-dev-qa-db-fra.com

Plusieurs instructions de mise à jour SQL en une seule requête

Je suis dans une situation où je dois mettre à jour environ 12 000 éléments dans ma base de données. Chaque ligne doit refléter un fichier Excel que j'ai créé précédemment. J'ai créé le fichier qui crée chaque ligne de l'instruction SQL, mais je ne sais pas si je peux exécuter chaque ligne dans une seule requête.

Ceci est un exemple de ce que j'essaie de faire.

UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.29' WHERE F01='0000000000001'
UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.39' WHERE F01='0000000000002'

Est-ce que cela fonctionnera ou y a-t-il de meilleures options pour ce que j'essaie de réaliser?

Chaque élément aura une valeur unique et la colonne à modifier aura également une valeur unique. Je ne vois pas comment je pourrais faire fonctionner cela avec une boucle, ou toute autre méthode que j'ai trouvée jusqu'à présent. Je me rends compte que cela pourrait prendre beaucoup de temps à traiter, mais le temps n'est pas un problème.

Merci d'avance

11
Erick Ely

Oui, vous pouvez ajouter toutes les instructions de mise à jour de ligne unique dans une seule requête, comme vous le faites.

10
Bassam Mehanni

Quelque chose comme ça est le mieux que vous puissiez faire: -

UPDATE [STORESQL].[dbo].[RPT_ITM_D] 
SET   F1301 = 
      case  F01 
      when '0000000000001' then '1.29'
      when '0000000000002' then '1.30'
end

En dehors de cela, l'exécution de plusieurs mises à jour est la solution.

20
Icarus

Je pense que la meilleure façon est d'importer la feuille Excel dans une table de votre base de données SQL. À partir de là, vous pouvez utiliser une jointure pour créer une déclaration de mise à jour unique pour les 12 000 éléments.

Pour plus d'informations sur la façon d'importer une feuille Excel dans SQL: http://msdn.Microsoft.com/en-us/library/ms141209.aspx

L'instruction de mise à jour ressemblerait alors à ceci:

UPDATE itemTable
SET F1301 = excelTable.<column with your value>
FROM [STORESQL].[dbo].[RPT_ITM_D] itemTable inner join [STORESQL].[dbo].[importedExcelTableName] excelTable on itemTable.F01 = excelTable.<column with the item code>

Si vous n'êtes pas sûr que cela fonctionnerait en toute sécurité, vous pouvez essayer cette requête pour une seule valeur en ajoutant simplement:

WHERE itemTable.F01 = '0000000000001'
2
F43G4N

Jetez un oeil à FUSIONNER par exemple quelque chose comme:

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
   USING (
          VALUES ('1.29', '0000000000001'),
                 ('1.39', '0000000000002')
         ) AS source (F1301, F01)
   ON F01 = source.F01
WHEN MATCHED THEN
   UPDATE
      SET F1301 = source.F1301;

... mais l'utilisation d'un constructeur de valeur de table de cette manière ne serait pas mise à l'échelle à 12 000 lignes! Essayez donc de copier d'abord les données d'Excel vers une table sur le serveur, puis utilisez la table comme source, par ex.

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
   USING [STORESQL].[dbo].MyStagingTable AS source
      ON F01 = source.F01
WHEN MATCHED THEN
   UPDATE
      SET F1301 = source.F1301;
2
onedaywhen

Si vous avez une quantité importante de données à mettre à jour, il peut être avantageux de charger le fichier Excel dans la base de données en tant que table, puis de mettre à jour votre table en fonction des données de cette table chargée.

   UPDATE RPT_ITM_D
      SET F1301 = NewTable.Value
     FROM RPT_ITM_D INNER JOIN NewTable ON (NewTable.F01 = RPT_ITEM_D.F01);

Si vous utilisez SQL Server, vous pouvez utiliser SSIS pour charger le fichier assez rapidement.

1
N West

Vous pouvez utiliser la fonction de concaténation dans Excel pour encadrer une requête, tout ce que vous devez faire est d'encadrer une seule requête de mise à jour et de la faire glisser pour le reste

concaténer ("Update set =" , ", where =" , ";")

Utilisez le format ci-dessus et faites glisser la cellule jusqu'à la fin ou double-cliquez dans le coin inférieur droit pour le remplissage automatique de l'instruction de mise à jour. Je crois que c'est le chemin le plus court possible et je l'exécute en une seule fois.

1
Arka Kahali