Как вставить несколько строк, не повторяя "вставить в dbo.Бла " часть заявления?
Я знаю, что делал это раньше много лет назад, но я не могу вспомнить синтаксис, и я не могу найти его нигде из-за подтягивания тонны справочных документов и статей о "массовом импорте".
вот что я хочу сделать, но синтаксис не совсем правильно... пожалуйста, кто-то, кто делал это раньше, помогите мне :)
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
Я знаю, что это закрыть получить правильный синтаксис. Мне может понадобиться слово "Навальный" или что-то еще, я не могу вспомнить. Любой идея?
мне это нужно для базы данных 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'.
13 ответов:
INSERT INTO dbo.MyTable (ID, Name) SELECT 123, 'Timmy' UNION ALL SELECT 124, 'Jonny' UNION ALL SELECT 125, 'Sally'для SQL Server 2008, может сделать это в одном предложении VALUES ровно в соответствии с утверждением в вашем вопросе (вам просто нужно добавить запятую, чтобы отделить каждый оператор values)...
ваш синтаксис почти работает в SQL Server 2008 (но не в 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 когда на вопрос был дан ответ, не было очевидно, что вопрос относится к SQL Server 2005. Я оставляю этот ответ здесь, так как я считаю, что он по-прежнему актуален.
Если ваши данные уже есть в вашей базе данных, вы можете сделать:
INSERT INTO MyTable(ID, Name) SELECT ID, NAME FROM OtherTableЕсли вам нужно жестко закодировать данные, то SQL 2008 и более поздние версии позволяют вам сделать следующее...
INSERT INTO MyTable (Name, ID) VALUES ('First',1), ('Second',2), ('Third',3), ('Fourth',4), ('Fifth',5)
вы могли бы сделать это (некрасиво, но это работает):
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
максимальное количество строк, которые могут быть построены путем вставки строк в списке значений 1000
самый простой способ опустить это ограничение-использовать производную таблицу например:
INSERT INTO dbo.Mytable(ID, Name) SELECT ID, Name FROM ( VALUES (1, 'a'), (2, 'b'), --... -- more than 1000 rows )sub (ID, Name);
это будет работать, начиная с SQL Server 2008+
вы можете использовать союз:
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)
это выглядит нормально для SQL Server 2008. Для SS2005 и более ранних версий необходимо повторить оператор VALUES.
INSERT INTO dbo.MyTable (ID, Name) VALUES (123, 'Timmy') VALUES (124, 'Jonny') VALUES (125, 'Sally')EDIT:: мой плохой. Вы должны повторить "вставить в" для каждой строки в 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')
было бы проще использовать XML в SQL Server для вставки нескольких строк, иначе это становится очень утомительным.
посмотреть полную статью с пояснениями кода здесь http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx
скопируйте следующий код в sql server для просмотра примера.
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)
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 INTO [TableName] (ID, Name) values (NEWID(), NEWID()) GO 10Он добавит десять строк с уникальными идентификаторами GUID для ID и Name.
Примечание: не заканчивайте последнюю строку (GO 10) С';', потому что это вызовет ошибку: произошла фатальная ошибка сценария. При разборе GO был обнаружен неправильный синтаксис.
соответствующую INSERT (Transact-SQL) (SQL Server 2005) вы не можете пропустить
INSERT INTO dbo.Blahи должны указывать его каждый раз или использовать другой синтаксис/подход,
это работает очень быстро и эффективно в SQL. Предположим, у вас есть таблица
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 table1 (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally');для будущих разработчиков, вы можете также вставить из другой таблицы:
INSERT INTO table1 (ID, Name) SELECT ID, Name FROM table2или даже из нескольких таблиц:
INSERT INTO table1 (column2, column3) SELECT t2.column, t3.column FROM table2 t2 INNER JOIN table3 t3 ON t2.ID = t3.ID
Comments