¿Cómo inserto varias filas SIN repetir la parte “INSERT INTO dbo.Blah” de la statement?

Sé que lo hice hace algunos años, pero no recuerdo la syntax, y no puedo encontrarla en ningún lado debido a que saqué toneladas de documentos de ayuda y artículos sobre “importaciones a granel”.

Esto es lo que quiero hacer, pero la syntax no es la correcta … por favor, alguien que haya hecho esto antes, ayúdenme 🙂

INSERT INTO dbo.MyTable (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') 

Sé que esto está cerca de la syntax correcta. Es posible que necesite la palabra “BULK” allí, o algo así, no puedo recordar. ¿Alguna idea?

Necesito esto para una base de datos SQL Server 2005. Probé este código, sin éxito:

 DECLARE @blah TABLE ( ID INT NOT NULL PRIMARY KEY, Name VARCHAR(100) NOT NULL ) INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy') VALUES (124, 'Jonny') VALUES (125, 'Sally') SELECT * FROM @blah 

Incorrect syntax near the keyword 'VALUES'.

 INSERT INTO dbo.MyTable (ID, Name) SELECT 123, 'Timmy' UNION ALL SELECT 124, 'Jonny' UNION ALL SELECT 125, 'Sally' 

Para SQL Server 2008, puede hacerlo en una cláusula VALUES exactamente de acuerdo con la statement en su pregunta (solo necesita agregar una coma para separar cada statement de valores) …

Su syntax casi funciona en SQL Server 2008 (pero no en SQL Server 2005 1 ):

 CREATE TABLE MyTable (id int, name char(10)); INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe'); SELECT * FROM MyTable; id | name ---+--------- 1 | Bob 2 | Peter 3 | Joe 

1 Cuando se respondió la pregunta, no se hizo evidente que la pregunta se refería a SQL Server 2005. Dejo esta respuesta aquí, ya que creo que sigue siendo relevante.

Si sus datos ya están en su base de datos, puede hacer lo siguiente:

 INSERT INTO MyTable(ID, Name) SELECT ID, NAME FROM OtherTable 

Si necesita codificar los datos, SQL 2008 y versiones posteriores le permiten hacer lo siguiente …

 INSERT INTO MyTable (Name, ID) VALUES ('First',1), ('Second',2), ('Third',3), ('Fourth',4), ('Fifth',5) 

Podrías hacer esto (feo pero funciona):

 INSERT INTO dbo.MyTable (ID, Name) select * from ( select 123, 'Timmy' union all select 124, 'Jonny' union all select 125, 'Sally' ... ) x 

Usando la syntax INSERT INTO ... VALUES como en la respuesta de Daniel Vassallo, hay una limitación molesta:

Desde MSDN

El número máximo de filas que se pueden construir insertando filas directamente en la lista VALORES es 1000

La forma más sencilla de omitir esta limitación es utilizar tablas derivadas como:

 INSERT INTO dbo.Mytable(ID, Name) SELECT ID, Name FROM ( VALUES (1, 'a'), (2, 'b'), --... -- more than 1000 rows )sub (ID, Name); 

LiveDemo


Esto funcionará a partir de SQL Server 2008+

Puedes usar una unión:

 INSERT INTO dbo.MyTable (ID, Name) SELECT ID, Name FROM ( SELECT 123, 'Timmy' UNION ALL SELECT 124, 'Jonny' UNION ALL SELECT 125, 'Sally' ) AS X (ID, Name) 

Esto se ve bien para SQL Server 2008. Para SS2005 y versiones anteriores, debe repetir la instrucción VALUES.

 INSERT INTO dbo.MyTable (ID, Name) VALUES (123, 'Timmy') VALUES (124, 'Jonny') VALUES (125, 'Sally') 

EDIT :: Mi mal. Debe repetir el ‘INSERT INTO’ para cada fila en SS2005.

 INSERT INTO dbo.MyTable (ID, Name) VALUES (123, 'Timmy') INSERT INTO dbo.MyTable (ID, Name) VALUES (124, 'Jonny') INSERT INTO dbo.MyTable (ID, Name) VALUES (125, 'Sally') 

Sería más fácil usar XML en SQL Server para insertar múltiples filas, de lo contrario, se vuelve muy tedioso.

Vea el artículo completo con las explicaciones del código aquí http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Copie el siguiente código en el servidor sql para ver una muestra.

 declare @test nvarchar(max) set @test = ' comment 1   comment 2   comment 3  ' declare @testxml xml set @testxml = cast(@test as xml) declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000)) insert @answerTemp SELECT ParamValues.ID.value('@id','int') , ParamValues.ID.value('@answerId','int') , ParamValues.ID.value('(comment)[1]','VARCHAR(1000)') FROM @testxml.nodes('topic/dialog') as ParamValues(ID) 
 USE YourDB GO 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 GO 

O PUEDE UTILIZAR OTRA MANERA

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

He estado usando lo siguiente:

 INSERT INTO [TableName] (ID, Name) values (NEWID(), NEWID()) GO 10 

Agregará diez filas con GUID únicos para ID y Nombre.

Nota: no finalice la última línea (GO 10) con ‘;’ porque arrojará un error: se produjo un error de secuencia de comandos fatal. Se encontró syntax incorrecta al analizar GO.

En correspondencia con INSERT (Transact-SQL) (SQL Server 2005), no puede omitir INSERT INTO dbo.Blah y debe especificarlo cada vez o utilizar otra syntax / enfoque.

Esto funciona muy rápido y es eficiente en SQL. Supongamos que tiene una Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) tabla Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) .

 CREATE TABLE [dbo].[Sample]( [a] [int] NULL, [b] [int] NULL, [c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [D] [int] NULL ) 

Así que no puede insertar múltiples registros en esta tabla usando la siguiente consulta sin repetir la instrucción de inserción,

 DECLARE @LIST VARCHAR(MAX) SET @LIST='SELECT 1, 1, ''Charan Ghate'',11 SELECT 2,2, ''Mahesh More'',12 SELECT 3,3,''Mahesh Nikam'',13 SELECT 4,4, ''Jay Kadam'',14' INSERT SAMPLE (a, b, c,d) EXEC(@LIST) 

También con C # usando SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Puedes insertar 10 filas a la vez

  DataTable dt = new DataTable(); dt.Columns.Add("a"); dt.Columns.Add("b"); dt.Columns.Add("c"); dt.Columns.Add("d"); for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["a"] = 1; dr["b"] = 2; dr["c"] = "Charan"; dr["d"] = 4; dt.Rows.Add(dr); } SqlConnection con = new SqlConnection("Connection String"); using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con)) { con.Open(); bulkcopy.DestinationTableName = "Sample"; bulkcopy.WriteToServer(dt); con.Close(); }