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);
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)