2010-07-17 38 views
16

Esta debería ser una pregunta bastante sencilla, pero no he podido encontrar una respuesta sólida en línea. Estoy tratando de insertar varias filas en la misma tabla, pero con solo una declaración. El más popular que he visto en línea es la siguiente, pero he leído que sólo funciona con SQL Server 2008:SQL Server 2005: Insertar varias filas con una sola consulta

INSERT INTO Table (Name, Location) VALUES 
('Name1', 'Location1'), 
('Name2', 'Location2'), 
('Name3', 'Location3'), etc... 

prefiero este método si va a trabajar con SQL Server 2005, pero no creo que lo haga La otra opción, por lo que he leído, tiene que ver con las siguientes instrucciones SELECT de UNION ALL después del INSERT, que parece torpe. ¿Alguien sabe con seguridad la mejor sintaxis para hacer esto en 2005?

Gracias.

Respuesta

21

Sí. Debe utilizar UNION ALL s en SQL Server 2005 para insertar varias filas en una secuencia de comandos SQL en una sola instrucción.

INSERT INTO Table 
    (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 

La otra alternativa principal es repetir los Insert sentencia varias veces, lo cual es aún más detallado. Debe tener cuidado de usar transacciones explícitas en este último caso para evitar la sobrecarga de muchas confirmaciones individuales (y por razones de atomicidad, por supuesto)

Si tiene muchas filas para insertar, puede usar BULK INSERT para cargarlo todo en desde un archivo delimitado en una declaración.

Finalmente, si se trata de datos que ya están en la base de datos que está creando (quizás para implementar en otro servidor), el complemento SSMS Tools Pack tiene una función "Generar inserciones de inserción" que puede generar estas afirmaciones.

+1

Para el registro, ¿le importaría escribir a máquina un ejemplo usando UNION ¿TODAS? –

3

Tienes que usar el union all en el servidor sql 2005. Para ser sincero, eso es tan torpe y feo, solo usaría inserts si fuera tú. Envuélvalos en una sola transacción y es lo mismo al final.

1

sí que son las únicas opciones, a menos que se está insertando una gran cantidad de datos y puede ser que desee explorar un BULK INSERT

INSERT INTO Table (Name, Location) 
SELECT 'Name1', 'Location1' UNION ALL 
SELECT 'Name2', 'Location2' UNION ALL 
SELECT 'Name3', 'Location3' 
5

Como otros han dicho, que la clave aquí es UNION ALL. Para mí, usar un CTE mantiene las cosas un poco más limpias, como p. Ej.

WITH NewStuff (Name, Location) 
    AS 
    (
     SELECT 'Name1', 'Location1' UNION ALL 
     SELECT 'Name2', 'Location2' UNION ALL 
     SELECT 'Name3', 'Location3' 
    ) 
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location 
    FROM NewStuff; 
0

Desde MS SQL Server 2005 admite el mejor método XML que sugeriría es un procedimiento almacenado con un parámetro de entrada de tipo XML. Si está trabajando con .NET se puede convertir fácilmente el conjunto de datos de cadena XML utilizando el método ds.GetXml() y se pueden enviar a la SP

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL) 
AS 
BEGIN 
    INSERT INTO [dbo].[TheLocations] 
     ([Name], [Location]) 
    SELECT 
     XTab.value('Name[1]','nvarchar(100)') AS[Name], 
     XTab.value('Location[1]','nvarchar(200)') AS[Location] 
    FROM @XML.nodes('TheLocations') XTab([XTab]) 
END 
Cuestiones relacionadas