2012-02-06 7 views
9

Sono in una situazione in cui devo aggiornare circa 12.000 elementi nel mio DB. Ogni riga deve rispecchiare un file excel creato in precedenza. Ho creato il file che crea ogni riga dell'istruzione SQL, ma non sono sicuro di poter eseguire ogni riga in una singola query.Più istruzioni di aggiornamento SQL in una singola query

Questo è un esempio di ciò che sto cercando di fare.

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' 

Questo lavoro o ci sono opzioni migliori per quello che sto cercando di ottenere?

Ogni articolo avrà un valore univoco e anche la colonna da modificare avrà un valore univoco. Non vedo come potrei farlo funzionare con un ciclo o con altri metodi che ho trovato finora. Mi rendo conto che questo potrebbe richiedere molto tempo per essere elaborato, ma il tempo non è un problema.

Grazie in anticipo

risposta

8

Sì, è possibile aggiungere tutte le istruzioni di aggiornamento su riga singola in una query come si sta facendo.

16

Qualcosa di simile a questo è il meglio che puoi fare: -

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

Oltre a questo, l'esecuzione di più aggiornamenti è la strada da percorrere.

+3

Sta cercando di aggiornare 12.000 valori univoci, non credo che Case sia un'opzione valida qui –

+0

@BassamMehanni Capisco. Stavo solo sottolineando che, per quanto riguarda la riduzione del numero di dichiarazioni di aggiornamento, usare 'case' è probabilmente il meglio che può fare. – Icarus

1

Se si dispone di una quantità significativa di dati da aggiornare, può essere vantaggioso caricare il file excel nel database come tabella, quindi aggiornare la tabella in base ai dati in questa tabella caricata.

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

Se siete su SQL Server, è possibile utilizzare SSIS per caricare il file abbastanza rapidamente.

2

Penso che il modo migliore sia importare il foglio di Excel in una tabella nel database SQL. Da lì potresti essere in grado di utilizzare un join per creare una singola dichiarazione di aggiornamento per tutti i 12.000 elementi.

Per informazioni su come importare foglio Excel in SQL: http://msdn.microsoft.com/en-us/library/ms141209.aspx

La dichiarazione di aggiornamento sarebbe quindi simile a questa:

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> 

Se non siete sicuri se questo dovrebbe funzionare in modo sicuro, è può provare questa query per un singolo valore per semplice aggiunta:

WHERE itemTable.F01 = '0000000000001' 
2

Date un'occhiata a MERGE esempio qualcosa di simile:

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; 

... ma utilizzando un costruttore valore di tabella in questo modo non sarebbe scalare fino a 12.000 righe! Quindi cerca di copiare prima i dati da Excel in una tabella sul server, quindi usa la tabella come sorgente, ad es.

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; 
0

È possibile utilizzare la funzione di concatenazione in Excel per inquadrare una query, Tutto quello che dovete fare è quello di inquadrare una singola query di aggiornamento e trascinare lo stesso per il resto

concatenate ("Update set =" ,, "dove = " ,, ";")

Utilizzare il formato sopra e trascinare la cella fino alla fine o fare doppio clic sull'angolo in basso a destra per il riempimento automatico dell'istruzione Update. Credo che questo sia il modo più breve possibile ed eseguirlo in un singolo Go.