sql-server - into - insert sentence sql server



¿Cómo inserto varias filas SIN repetir la parte “INSERT INTO dbo.Blah” de la declaración? (9)

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 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.


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)

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+


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)




insert