Jak wstawić wiele wierszy bez powtarzania " wstaw do dbo.Bla " część oświadczenia?

Wiem, że robiłem to już wiele lat temu, ale nie pamiętam składni i nie mogę go znaleźć nigdzie z powodu wyciągania ton dokumentów pomocy i artykułów o "importach masowych".

Oto, co chcę zrobić, ale składnia nie jest dokładnie w porządku... proszę, ktoś, kto już to robił, niech mi pomoże:)

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

Wiem, że jest to blisko do właściwej składni. Mogę potrzebować słowa "masa", czy coś, nie pamiętam. Jakiś pomysł?

Potrzebuję tego do bazy danych SQL Server 2005. Próbowałem tego kodu, bez skutku:

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

I ' m getting Incorrect syntax near the keyword 'VALUES'.

Author: Robert Harvey, 2010-04-12

13 answers

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

Dla SQL Server 2008, może to zrobić w jednej klauzuli wartości Dokładnie zgodnie z Instrukcją w twoim pytaniu(wystarczy dodać przecinek, aby oddzielić każdą instrukcję wartości)...

 290
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 13:05:00

Twoja składnia prawie działa w SQL Server 2008 (ale nie w SQL Server 20051):

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 Kiedy na to pytanie udzielono odpowiedzi, nie było oczywiste, że pytanie odnosi się do SQL Server 2005. Zostawiam tę odpowiedź tutaj, ponieważ uważam, że jest ona nadal aktualna.

 441
Author: Daniel Vassallo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 14:11:19

Jeśli Twoje dane są już w Twojej bazie danych możesz zrobić:

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

Jeśli potrzebujesz twardego kodu danych, SQL 2008 i nowsze wersje pozwalają wykonać następujące czynności...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
 211
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 22:22:54

Mógłbyś to zrobić (brzydki ale działa):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x
 13
Author: davek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 19:23:15

Używając INSERT INTO ... VALUES składni jak w Daniel Vassallo ' S odpowiedz jest jedno irytujące ograniczenie:

From MSDN

Maksymalna liczba wierszy, które można zbudować poprzez wstawienie wierszy bezpośrednio do listy wartości, wynosi 1000

Najprostszym sposobem na pominięcie tego ograniczenia jest użycie pochodnej tabeli, takiej jak:

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

LiveDemo


to będzie działać począwszy od SQL Server 2008+
 13
Author: Lukasz Szozda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 14:20:16

Możesz użyć Unii:

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)
 8
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 19:24:30

To wygląda OK dla SQL Server 2008. W przypadku SS2005 i wcześniejszych, musisz powtórzyć instrukcję VALUES.

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

EDIT:: mój błąd. Musisz powtórzyć "INSERT INTO" dla każdego wiersza w 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')  
 6
Author: DaveE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 17:21:28

Byłoby łatwiej używać XML w SQL Server do wstawiania wielu wierszy, w przeciwnym razie staje się to bardzo żmudne.

Zobacz pełny artykuł z objaśnieniami kodu tutaj http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Skopiuj poniższy kod do sql server, aby wyświetlić próbkę.

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)
 6
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 00:16:20
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

LUB MOŻESZ UŻYĆ INNEGO SPOSOBU

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
 6
Author: gngolakia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 07:36:27

Używam:

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

Doda dziesięć wierszy z unikalnymi identyfikatorami GUID dla identyfikatora i nazwy.

Uwaga: nie kończ ostatniej linii (idź 10) znakiem';', ponieważ spowoduje to błąd: wystąpił fatalny błąd skryptu. Podczas parsowania GO napotkano nieprawidłową składnię.

 6
Author: valentinvs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 13:04:30

Odpowiadający INSERT (Transact-SQL) (SQL Server 2005) nie można pominąć INSERT INTO dbo.Blah i trzeba go każdorazowo określać lub użyć innej składni / podejścia,

 5
Author: abatishchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 17:33:15

To działa bardzo szybko i wydajnie w SQL. Załóżmy, że masz tabelę 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
)

Więc nie można wstawić wielu rekordów w tej tabeli za pomocą następującego zapytania bez powtarzania instrukcji 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)

Również z C # używając SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Możesz wstawić 10 wierszy na raz

   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();
        }
 2
Author: Charan Ghate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-19 21:31:20

To osiągnie to, o co prosisz:

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

Dla przyszłych programistów, można również wstawić z innej tabeli :

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

Lub nawet z wielu tabel :

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID
 0
Author: Tigerjz32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 17:08:04