values transact techonthenet multiples into sql-server tsql sql-server-2005 insert

sql server - transact - ¿Cómo inserto varias filas SIN repetir la parte “INSERT INTO dbo.Blah” de la declaración?



multiples insert sql (13)

Sé que he hecho esto hace años, pero no recuerdo la sintaxis, y no puedo encontrarla en ninguna parte debido a la gran cantidad de documentos de ayuda y artículos sobre "importaciones masivas".

Esto es lo que quiero hacer, pero la sintaxis no es exactamente correcta ... por favor, alguien que haya hecho esto antes, ayúdame :)

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

Sé que esto está cerca de la sintaxis correcta. Puede que necesite la palabra "BULK", o algo así, que no puedo recordar. ¿Alguna idea?

Necesito esto para una base de datos de SQL Server 2005. He intentado este código, en vano:

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

Estoy obteniendo una Incorrect syntax near the keyword ''VALUES''.


En correspondencia con INSERT (Transact-SQL) (SQL Server 2005) no puede omitir INSERT INTO dbo.Blah y tiene que especificarlo cada vez o usar otra sintaxis / enfoque,


Esto está funcionando muy rápido y 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(); }


Esto logrará lo que estás preguntando sobre:

INSERT INTO table1 (ID, Name) VALUES (123, ''Timmy''), (124, ''Jonny''), (125, ''Sally'');

Para futuros desarrolladores, también puede insertar desde otra tabla :

INSERT INTO table1 (ID, Name) SELECT ID, Name FROM table2

O incluso desde varias tablas :

INSERT INTO table1 (column2, column3) SELECT t2.column, t3.column FROM table2 t2 INNER JOIN table3 t3 ON t2.ID = t3.ID


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

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

EDITAR :: Mi mal. Debe repetir ''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'')


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 termine la última línea (GO 10) con '';'' porque arrojará un error: se produjo un error de script fatal. Se encontró una sintaxis incorrecta al analizar GO.


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


Puedes usar un sindicato:

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)


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

Vea el artículo completo con explicaciones de 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 = ''<topic><dialog id="1" answerId="41"> <comment>comment 1</comment> </dialog> <dialog id="2" answerId="42" > <comment>comment 2</comment> </dialog> <dialog id="3" answerId="43" > <comment>comment 3</comment> </dialog> </topic>'' 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)


Si sus datos ya están en su base de datos, puede hacerlo:

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

Si necesita codificar los datos, SQL 2008 y las versiones posteriores le permitirán hacer lo siguiente ...

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


Su sintaxis 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ó a 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.


Usando la sintaxis de 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 de VALORES es 1000

La forma más fácil de omitir esta limitación es usar la tabla derivada 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+

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 según la declaración de su pregunta (solo necesita agregar una coma para separar cada declaración de valores) ...


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 PUEDES UTILIZAR OTRA MANERA

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