sql-server - statement - tsql insert from




Come inserisco più righe SENZA ripetere la parte "INSERT INTO dbo.Blah" dell'istruzione? (9)

So di averlo fatto prima di anni fa, ma non riesco a ricordare la sintassi, e non riesco a trovarlo da nessuna parte a causa del richiamo di tonnellate di documenti di aiuto e articoli sulle "importazioni di massa".

Ecco cosa voglio fare, ma la sintassi non è esattamente giusta ... per favore, qualcuno che ha già fatto questo, aiutami :)

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

So che questo è vicino alla sintassi giusta. Potrei aver bisogno della parola "BULK" lì dentro, o qualcosa del genere, non riesco a ricordare. Qualche idea?

Ho bisogno di questo per un database SQL Server 2005. Ho provato questo codice, senza alcun risultato:

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

Ricevo Incorrect syntax near the keyword 'VALUES'.


Corrispondente ad INSERT (Transact-SQL) (SQL Server 2005) non puoi omettere INSERT INTO dbo.Blah e INSERT INTO dbo.Blah specificarlo ogni volta o usare un altro sintassi / approccio,


Funziona molto veloce ed efficiente in SQL. Supponiamo di avere un Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) tabella 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
)

Quindi non puoi inserire più record in questa tabella usando la seguente query senza ripetere la frase insert,

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)

Anche con C # usando SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

È possibile inserire 10 righe alla volta

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

La tua sintassi funziona quasi in SQL Server 2008 (ma non in 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 Quando la domanda è stata risolta, non è stato reso evidente che la domanda si riferiva a SQL Server 2005. Sto lasciando questa risposta qui, poiché ritengo che sia ancora pertinente.


Potresti fare questo (brutto ma funziona):

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

Questo realizzerà ciò che stai chiedendo:

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

Per gli sviluppatori futuri, puoi anche inserire da un'altra tabella :

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

O anche da più tabelle :

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

Sarebbe più semplice usare XML in SQL Server per inserire più righe, altrimenti diventa molto noioso.

Visualizza l'articolo completo con le spiegazioni sul codice qui http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Copia il seguente codice in SQL Server per visualizzare un campione.

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)

Sembra OK per SQL Server 2008. Per SS2005 e versioni precedenti, è necessario ripetere l'istruzione VALUES.

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

EDIT :: Il mio male. Devi ripetere "INSERT INTO" per ogni riga in 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')  

Usando la sintassi INSERT INTO ... VALUES come nella risposta di Daniel Vassallo c'è una seccante limitazione:

Da MSDN

Il numero massimo di righe che possono essere costruite inserendo righe direttamente nell'elenco VALUES è 1000

Il modo più semplice per omettere questa limitazione è usare la tabella derivata come:

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

LiveDemo

Funzionerà a partire da 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 PUOI USARE UN ALTRO MODO

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






insert