2010-12-28 36 views
5

Estoy agregando funciones a un proyecto ASP.NET existente. El código llama a un procedimiento almacenado para agregar una fila a una tabla en particular. Necesito la opción de permitir también que una de las columnas tenga múltiples valores, en cuyo caso se agregaría una fila para cada valor en esa columna.La mejor forma de insertar varias filas (ADO.NET)

Sé que puedo llamar a mi método de inserción una vez por cada fila, pero eso suena terriblemente ineficiente. Sé que podría escribir múltiples líneas, delimitadas por punto y coma, y ​​enviarlas a la base de datos en una sola solicitud. Pero el código existente llama a un procedimiento almacenado y, por lo tanto, múltiples instrucciones de inserción requerirían que modifique el diablo del código existente.

Tenga en cuenta que los valores múltiples se almacenarán como líneas múltiples en un cuadro de texto, una línea por valor, y obviamente se debe comprobar que se ingresaron correctamente.

¿Hay una forma más sencilla de abordar esto?

+0

+1 - También estoy interesado en la respuesta a esta pregunta –

+0

¿Qué versión de SQL Server por favor? La respuesta puede variar de 2000 a 2005 a 2008 ... – gbn

+0

No estoy 100% claro sobre lo que usarán en el servidor. Por lo tanto, probablemente no desee orientarme a nada específico que haya aparecido después de 2005. –

Respuesta

2

SQL Server 2008 tiene la parámetros de "tipo de tabla" que permite múltiples filas como parámetros. Un ejemplo se define en this SO question

SQL Server 2005+ tiene un buen manejo de XML. Usamos esto actualmente para pequeños conjuntos de datos. El manejo de SQL Server 2000 XML no es tan bueno.

Para todas las versiones, puede crear una tabla temporal y luego llamar a un proceso almacenado que utiliza esta tabla. Puede usar SQLBulkCopy para cargar la tabla. Útil para muchas filas.

En general, el problema es común. Erland Sommarskog tiene un artículo "Arrays and Lists in SQL Server 2005 and Beyond" que es (uno de) los artículos definitivos sobre el tema (tiene más).

Resumen:

  • tipo de tabla (SQL Server 2008+)
  • XML (más fácil con SQL Server 2005 +) (todas las versiones)
  • tabla temporal
+0

Interesante. Podría ser un poco más de lo que quiero saltar en este momento. –

0

¿Qué pasa algo como esto:

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 

Robados de here.

Si está utilizando SQL Server 2008 puede utilizar este método:

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

seguro de cómo se puede conseguir esto para trabajar con un procedimiento almacenado a través ...

+0

Gracias, pero no veo que esto sea compatible con un procedimiento almacenado. El código anterior sabe con anticipación cuántos valores insertar y, por lo tanto, debe realizarse en el extremo del cliente. –

+0

No creo que pueda hacer lo que quiera con un proceso almacenado, a menos que haga 'EXEC sp_MyProc' una y otra vez. No necesita saber la cantidad de insertos que se realizarán para usar el método anterior si usa un ciclo para crear la instrucción SQL que se ejecutará. Si utiliza un bucle para crear la instrucción SQL, tenga MUCHO cuidado de no dejarse abierto a la inyección SQL. –

0

Terminé enviar una cadena delimitada como uno de los argumentos de procedimiento almacenados, y luego analizar cada elemento de la cadena y agregar una fila para cada uno.

No estoy seguro de que esta sea la mejor manera de lograr esto, pero no requirió mucha modificación del código existente y parece que debería ser bastante eficiente para mí.

+0

Esto se describe en realidad en el enlace de mi artículo – gbn

+0

Al menos uno de esos artículos fue extremadamente largo. ¿Podría ser un poco más específico sobre qué enlace? Gracias. –

+0

"Matrices y listas en SQL Server 2005 y más allá". Es largo porque es un tema complejo – gbn

0

Eche un vistazo a SqlBulkCopy, le permitirá pasar su Datatable directamente a la base de datos.

Cuestiones relacionadas