2010-12-28 9 views
5

Sto aggiungendo funzionalità a un progetto ASP.NET esistente. Il codice chiama una stored procedure per aggiungere una riga a una tabella specifica. Ho bisogno dell'opzione di consentire anche a una delle colonne di avere più valori, nel qual caso verrà aggiunta una riga per ogni valore in quella colonna.Il modo migliore per inserire più righe (ADO.NET)

So che posso chiamare il mio metodo di inserimento una volta per ogni riga, ma suona orribilmente inefficiente. So che potrei scrivere più righe, delimitate da punti e virgola, e inviarle al database in una sola richiesta. Ma il codice esistente chiama una procedura memorizzata e quindi più istruzioni di inserimento richiederebbero di modificare il diavolo del codice esistente.

Si noti che i valori multipli verranno memorizzati come più righe in una casella di testo, una riga per valore e, ovviamente, devono essere verificati per essere immessi correttamente.

C'è un modo più semplice per avvicinarsi a questo?

+0

+1 - Sono anche interessato alla risposta a questa domanda –

+0

Quale versione di SQL Server si prega di? La risposta può variare dal 2000 al 2005 al 2008 ... – gbn

+0

Non sono al 100% chiaro su cosa utilizzeranno sul server. Quindi probabilmente non vorrei prendere di mira qualcosa di specifico che è venuto dopo il 2005. –

risposta

2

SQL Server 2008 ha la parametri "tipo tabella" che consentono più righe come parametri. Un esempio è definito in this SO question

SQL Server 2005+ ha una buona gestione XML. Lo usiamo al momento per piccoli set di dati. La gestione XML di SQL Server 2000 non è così bella.

Per tutte le versioni, è possibile creare una tabella temporanea quindi chiamare un processo memorizzato che utilizza questa tabella. È possibile utilizzare SQLBulkCopy per caricare la tabella. Utile per molte file.

Generalmente, il problema è comune. Erland Sommarskog ha un articolo "Arrays and Lists in SQL Server 2005 and Beyond" che è (uno di) gli articoli definitivi sull'argomento (ne ha di più).

Sommario:

  • tipo di tabella (SQL Server 2008+)
  • XML (più facile con SQL Server 2005 +)
  • tabella temporanea (tutte le versioni)
+0

Interessante. Potrebbe essere un po 'più di quanto voglio saltare in questo momento. –

0

Che dire qualcosa di simile:

INSERT INTO MyTable (FirstCol, SecondCol) 
SELECT 'First' ,1 
UNION ALL 
SELECT 'Second' ,2 
UNION ALL 
SELECT 'Third' ,3 
UNION ALL 
SELECT 'Fourth' ,4 
UNION ALL 
SELECT 'Fifth' ,5 

rubato da here.

Se si utilizza SQL Server 2008 è possibile utilizzare questo metodo:

INSERT INTO MyTable (FirstCol, SecondCol) 
VALUES('First' ,1) 
VALUES('Second' ,2) 
VALUES('Third' ,3) 
VALUES('Fourth' ,4) 

Non so come si potrebbe ottenere questo al lavoro con una stored procedure tramite ...

+0

Grazie ma non vedo che questo sia compatibile con una procedura memorizzata. Il codice sopra conosce quanti valori inserire e dovrebbe quindi essere eseguito sul client. –

+0

Non penso che tu possa fare quello che vuoi con un proc memorizzato, a meno che tu non faccia 'EXEC sp_MyProc' più e più volte. Non è necessario conoscere il numero di inserti che verranno eseguiti per utilizzare il metodo sopra se si utilizza un ciclo per creare l'istruzione SQL che verrà eseguita. Se usi un ciclo per creare l'istruzione SQL fai MOLTO attenzione a non lasciarti aperto a SQL Injection. –

0

ho finito inviare una stringa delimitata come uno degli argomenti della stored procedure, quindi analizzare ogni elemento dalla stringa e aggiungere una riga per ciascuno.

Non sono sicuro che questo sia il modo migliore per farlo, ma non ha richiesto molto rielaborazione del codice esistente e sembra che dovrebbe essere abbastanza efficiente per me.

+0

Questo è in realtà descritto nel mio articolo link – gbn

+0

Almeno uno di quegli articoli era estremamente lungo. Potresti essere un po 'più specifico su quale link? Grazie. –

+0

"Array ed elenchi in SQL Server 2005 e versioni successive". È lungo perché è un argomento complesso – gbn

0

Controlla SqlBulkCopy, ti permetterà di passare il tuo Datatable direttamente al database.

Problemi correlati