Tengo un conjunto de datos en ADO.NET que contiene varios registros del lado del usuario. Necesito insertar todas esas filas en una sola consulta en la base de datos, para evitar múltiples consultas¿Cómo puedo usar una única consulta para insertar múltiples registros del conjunto de datos en SQL Server 2005?
Respuesta
Tal vez algo como una copia masiva sería una respuesta. El ejemplo en Code Project a continuación muestra cómo hacerlo usando una DataTable, pero debería poder cambiar el ejemplo para usar un DataSet.
A continuación se muestra una pequeña parte del código que abarca la detección y la eliminación en SQL Server (tomado de CodeProject).
La parte clave a tener en cuenta es bulkcopy.WriteToServer (SourceTable); fueron los SourceTable sería la parte del conjunto de datos que pasaría a ella
//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();
}
}
Mientras SqlBulkCopy
obras para las inserciones, que no pueden hacer actualizaciones masivas. Esto puede o no ser un problema para usted, pero en cualquier caso puede utilizar un procedimiento almacenado que utiliza OPENXML para permitir inserciones y actualizaciones masivas. También necesitará sp_xml_preparedocument y sp_xml_removedocument.
Otra gran ventaja de este método es que puede obtener los identificadores de las entidades que acaba de insertar a granel, utilizando la cláusula OUTPUT.
Ejemplo de inserción a granel.
Suponiendo que ha definido un parámetro @p_XmlData VARCHAR(MAX)
en el proceso almacenado que define los datos para insertar o actualizar. Para un ejemplo del XML que necesita para pasar, puede hacer:
SELECT TOP 1 *, 0 AS __ORDERBY FROM dbo.YourEntity AS YourEntity FOR XML AUTO, ROOT('ROOT')
A continuación, el procedimiento almacenado se verá algo como esto
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
Bonita expansión en mi respuesta + 1 – kevchadders
propongo que usted envía a sus tablas de datos de usted conjunto de datos a un procedimiento almacenado que usa un parámetro de valor de tabla. A continuación, puede realizar una instrucción de inserción para rellenar la base de datos con sus registros de conjunto de datos.
- 1. SQL Server 2005: Insertar varias filas con una sola consulta
- 2. Cómo usar una consulta de selección dentro de una consulta de inserción en SQL Server 2005
- 3. Insertar valores múltiples usando INSERT INTO (SQL Server 2005)
- 4. Múltiples idiomas en una base de datos - SQL Server 2005
- 5. Cómo crear una restricción única compuesta en SQL Server 2005
- 6. SQL Server 2005 ¿Cómo crear una restricción única?
- 7. ¿Puedo usar SQL Server Management Studio 2005 para 2008 DB?
- 8. Consulta SQL para mostrar todas las vistas en una base de datos de SQL Server 2005
- 9. Eliminar registros de SQL Server 2005 sin iniciar sesión
- 10. ¿Cómo debo insertar múltiples registros múltiples?
- 11. SQL Server 2005 Restricción única en dos columnas
- 12. Cómo exportar la consulta de SQL Server 2005 a CSV
- 13. Sql insertar rendimiento de consulta
- 14. sql server 2005 - exportar datos nvarchar (max)
- 15. SQL Server 2005 replicación
- 16. ¿Cómo puedo insertar datos en SQL Server utilizando VBNet
- 17. Cómo debo usar BIT en SQL Server 2005
- 18. Consulta SQL para agregar una nueva columna después de una columna existente en SQL Server 2005
- 19. ¿Cómo insertar múltiples registros y obtener el valor de identidad?
- 20. ¿Cómo puedo deshacer una consulta de actualización en SQL Server 2005?
- 21. ¿Cómo puedo transformar filas en columnas en SQL server 2005
- 22. ¿Cómo recuperar datos XML de SQL Server 2005?
- 23. Consultas jerárquicas en SQL Server 2005
- 24. Buscar una tabla en múltiples bases de datos SQL SERVER 2005
- 25. Consulta SQL para insertar en grails
- 26. ¿Puedo usar una secuencia para INSERTAR o ACTUALIZAR una fila en SQL Server (C#)?
- 27. ¿Cómo puedo crear un desencadenador deshabilitado en SQL Server 2005?
- 28. consulta SQL para obtener registros
- 29. SQL Server 2008 a SQL Server 2005
- 30. SQL Insertar múltiples filas
Configuración de una BatchSize apropiado y utilizando SqlBulkCopyOptions.TableLock puede resultar en un rendimiento mucho mejor. Prueba tu escenario. Consulte http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx para un análisis detallado. –
@ Winston - Gracias por el útil enlace – kevchadders