Ho un set di dati in ADO.NET che contiene più record dal lato utente. Ho bisogno di inserire tutte le righe in una singola query nel database, al fine di evitare più queryCome è possibile utilizzare una singola query per inserire più record dall'insieme di dati in SQL Server 2005?
risposta
Forse qualcosa come una copia Bulk sarebbe una risposta. L'esempio in Code Project di seguito mostra come farlo usando un DataTable, ma dovresti essere in grado di cambiare l'esempio per usare un DataSet.
Di seguito è riportata una piccola parte del codice che copre la connessione e l'esecuzione in SQL Server (preso da CodeProject).
La parte fondamentale da notare è il bulkcopy.WriteToServer (SourceTable); sono stati la SourceTable sarebbe la parte del DataSet si passa ad esso
//First create a connection string to destination database
string connectionString;
connectionString = <EM>YourConnectionString</EM>and
Initial Catalog=TestSMODatabase";
//Open a connection with destination database;
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
//Open bulkcopy connection.
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(connection))
{
//Set destination table name
//to table previously created.
bulkcopy.DestinationTableName = "dbo.TestTable";
try
{
bulkcopy.WriteToServer(SourceTable); // SourceTable would come from your DataSet
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
connection.Close();
}
}
Mentre SqlBulkCopy
lavori per inserimenti di massa, non si può fare gli aggiornamenti di massa. Questo può o non può essere un problema per te, ma in ogni caso puoi utilizzare una stored procedure che utilizza OPENXML per consentire inserimenti e aggiornamenti di massa. Avrai anche bisogno di sp_xml_preparedocument e sp_xml_removedocument.
Un altro grande vantaggio di questo metodo è che è possibile ottenere gli ID delle entità appena aggiunte, utilizzando la clausola OUTPUT.
Esempio di un inserto di massa.
Supponendo di aver definito un parametro @p_XmlData VARCHAR(MAX)
sul processo memorizzato che definisce i dati da inserire o aggiornare. Per un esempio di codice XML è necessario passare, si può fare:
SELECT TOP 1 *, 0 AS __ORDERBY FROM dbo.YourEntity AS YourEntity FOR XML AUTO, ROOT('ROOT')
Poi la stored procedure sarà simile a questa
DECLARE @hDoc INT
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData
INSERT INTO dbo.YourEntity
(
[Field1],
[Field2]
)
SELECT
XMLData.Field1,
XMLData.Field2
FROM OPENXML (@hdoc, 'ROOT/YourEntity', 1)
WITH
(
[Field1] int,
[Field2] varchar(50),
[__ORDERBY] int
) AS XMLData
EXEC sp_xml_removedocument @hDoc
Bella espansione sulla mia risposta + 1 – kevchadders
propongo di inviare i DataTable da voi DataSet una procedura memorizzata che utilizza un parametro Tabella stimata. È quindi possibile eseguire un'istruzione di inserimento per popolare il database con i record del set di dati.
- 1. Come utilizzare una query di selezione all'interno di una query di inserimento in SQL Server 2005
- 2. Come utilizzare BIT in SQL Server 2005
- 3. Elimina righe da più tabelle utilizzando una singola query (SQL Express 2005), con una condizione WHERE
- 4. Come inserire i dati XML in tabella in sql server 2005
- 5. Eliminazione di più righe con una singola query
- 6. SQL Server 2005 replica
- 7. Come devo inserire più record multipli?
- 8. SQL Inserire una riga o più righe di dati?
- 9. Come utilizzare rawQuery per inserire un record
- 10. Più chiamate Row_Number() in una query SQL singola
- 11. Come utilizzare la condizione come con più valori in sql server 2005?
- 12. Elimina record di SQL Server 2005 senza registrazione
- 13. SQL Server 2005/2008: inserire un file in una colonna varbinary (max) in Transact-SQL
- 14. Più istruzioni di aggiornamento SQL in una singola query
- 15. Crea query SQL singola utilizzando join .è possibile?
- 16. Inserire i dati in vista (SQL Server)
- 17. Voglio utilizzare l'istruzione CASE per aggiornare alcuni record in sql server 2005
- 18. inserire i dati da una tabella in più tabelle
- 19. Qual è il limite delle variabili SQL che è possibile specificare in una singola query execSQL
- 20. Risultati di query di raggruppamento SQL per una singola colonna
- 21. È possibile scoprire chi ha chiamato una procedura di archiviazione in sql server 2005
- 22. è possibile inserire SQL utilizzando select restituire più identità?
- 23. È possibile utilizzare SQL Server e Mongo insieme?
- 24. Inserire dati UTF8 in SQL Server 2008
- 25. Come utilizzare la clausola OUTPUT di SQL Server per l'aggiornamento
- 26. bloccato con una query in SQL Server
- 27. È possibile inserire un'intera DataTable VB.NET in un server SQL in una volta
- 28. Isoweek in SQL Server 2005
- 29. Come creare una directory del file system in una chiamata/query di SQL Server 2005
- 30. SQL (DB2) Restituisce più conteggi condizionali in una singola query
impostazione di una BatchSize appropriata e utilizzando SqlBulkCopyOptions.TableLock può provocare prestazioni molto migliori. Prova per il tuo scenario. Vedi http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx per un'analisi dettagliata. –
@ Winston - Grazie per il link utile – kevchadders