sql-server - values - t sql select insert




Как вставить несколько строк без повторения части инструкции INSERT INTO dbo.Blah? (9)

Было бы проще использовать XML в SQL Server для вставки нескольких строк, иначе это станет очень утомительным.

Посмотреть полную статью с пояснениями здесь здесь http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Скопируйте следующий код в SQL-сервер, чтобы просмотреть образец.

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)

Я знаю, что делал это раньше лет назад, но я не могу вспомнить синтаксис, и я не могу найти его нигде из-за того, что вытаскиваем тонны справочных документов и статей о «массовом импорте».

Вот что я хочу сделать, но синтаксис не совсем прав ... пожалуйста, тот, кто сделал это раньше, помогите мне :)

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

Я знаю, что это близко к правильному синтаксису. Мне может понадобиться слово «BULK», или что-то, я не могу вспомнить. Любая идея?

Мне нужно это для базы данных SQL Server 2005. Я пробовал этот код, но безрезультатно:

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

Я получаю Incorrect syntax near the keyword 'VALUES'.


В соответствии с INSERT (Transact-SQL) (SQL Server 2005) вы не можете пропустить INSERT INTO dbo.Blah и должны указывать его каждый раз или использовать другой синтаксис / подход,


Вы можете использовать объединение:

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)

Вы можете сделать это (уродливый, но он работает):

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

Используя синтаксис INSERT INTO ... VALUES как в ответе Даниэля Вассалло, есть одно раздражающее ограничение:

Из MSDN

Максимальное количество строк, которые могут быть построены путем вставки строк непосредственно в список VALUES, составляет 1000

Самый простой способ опустить это ограничение - использовать производную таблицу типа:

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

LiveDemo

Это будет работать с SQL Server 2008+


Это выглядит нормально для SQL Server 2008. Для SS2005 и более ранних версий вам нужно повторить оператор VALUES.

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

EDIT :: Мой плохой. Вы должны повторить «INSERT INTO» для каждой строки в 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')  

Это работает очень быстро и эффективно в SQL. Предположим, что у вас есть Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) таблицы 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
)

Таким образом, вы не можете вставить несколько записей в эту таблицу, используя следующий запрос без повторения инструкции 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)

Также с C # с использованием SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Вы можете вставлять по 10 строк за раз

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

Я использовал следующее:

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

Он добавит десять строк с уникальными идентификаторами GUID для ID и Name.

Примечание: не заканчивайте последнюю строку (GO 10) на ';' потому что это вызовет ошибку: произошла фатальная ошибка сценария. Неправильный синтаксис встречался при разборе GO.


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

ИЛИ ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ДРУГОЙ ПУТЬ

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




insert