Comment puis-je insérer plusieurs lignes sans répéter le "INSERT INTO dbo.Bla" la partie de la déclaration?
je sais que je l'ai fait avant il y a des années, mais je ne me souviens pas de la syntaxe, et je ne peux pas le trouver n'importe où en raison de tirer vers le haut des tonnes de Docs d'AIDE et des articles au sujet des"importations en vrac".
voici ce que je veux faire, mais la syntaxe n'est pas exactement correcte... s'il vous plaît, quelqu'un qui a fait cela avant, de m'aider :)
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
je sais que c'est fermer à la bonne syntaxe. Je pourrais avoir besoin du mot "vrac" là-dedans, ou quelque chose, je ne me souviens pas. Une idée?
j'en ai besoin pour une base de données SQL Server 2005. J'ai essayé ce code, en vain:
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
je suis Incorrect syntax near the keyword 'VALUES'.
13 réponses
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
pour SQL Server 2008, peut le faire dans une clause de valeurs exactement selon l'énoncé de votre question (vous avez juste besoin d'ajouter une virgule pour séparer chaque énoncé de valeurs)...
votre syntaxe fonctionne presque dans SQL Server 2008 (mais pas dans 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 Lorsqu'on a répondu à la question, il n'était pas évident que la question faisait référence à SQL Server 2005. Je laisse cette réponse ici, car je pense qu'elle est toujours pertinente.
si vos données sont déjà dans votre base de données, vous pouvez faire:
INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable
si vous avez besoin de code dur les données puis SQL 2008 et les versions suivantes vous permettent de faire ce qui suit...
INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
on pourrait faire ça (moche mais ça fonctionne):
INSERT INTO dbo.MyTable (ID, Name)
select * from
(
select 123, 'Timmy'
union all
select 124, 'Jonny'
union all
select 125, 'Sally'
...
) x
utilisant la syntaxe INSERT INTO ... VALUES
comme dans réponse de Daniel Vassallo
il y a une limite gênante:
de MSDN
le nombre maximum de lignes qui peuvent être construites en insérant des lignes directement dans la liste des valeurs est 1000
la façon la plus facile d'omettre cette limitation est d'utiliser une table dérivée comme:
INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name
FROM (
VALUES (1, 'a'),
(2, 'b'),
--...
-- more than 1000 rows
)sub (ID, Name);
cela fonctionnera à partir de SQL Server 2008+
vous pouvez utiliser un syndicat:
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)
cela semble correct pour SQL Server 2008. Pour SS2005 & earlier, vous devez répéter l'énoncé des valeurs.
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy')
VALUES (124, 'Jonny')
VALUES (125, 'Sally')
EDIT:: My bad. Vous devez répéter le 'INSERT INTO' pour chaque ligne dans 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')
il serait plus facile D'utiliser XML dans SQL Server pour insérer plusieurs lignes sinon cela devient très fastidieux.
lire l'article complet avec les explications du code ici http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx
Copiez le code suivant dans sql server pour voir un échantillon.
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
OU VOUS POUVEZ UTILISER UNE AUTRE FAÇON
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
j'ai utilisé le suivant:
INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10
il ajoutera dix lignes avec des GUIDs uniques pour L'ID et le nom.
Note: ne terminez pas la dernière ligne (GO 10) avec ';' parce qu'elle va lancer une erreur: une erreur fatale de script s'est produite. Une syntaxe incorrecte a été rencontrée lors de L'analyse de GO.
correspondant à insérer (Transact-SQL) (SQL Server 2005) vous ne pouvez pas omettre INSERT INTO dbo.Blah
et devez le spécifier à chaque fois ou utiliser une autre syntaxe / approche,
cela fonctionne très vite,et efficace en SQL.
Supposons que vous ayez la Table 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
)
donc vous ne pouvez pas insérer plusieurs enregistrements dans cette table en utilisant la requête suivante sans répéter l'énoncé d'insertion,
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)
aussi avec C # utilisant SqlBulkCopy bulkcopy = new SqlBulkCopy(con)
vous pouvez insérer 10 lignes à la fois
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();
}
cela permettra d'obtenir ce que vous demandez:
INSERT INTO table1 (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally');
pour les futurs développeurs, vous pouvez aussi insérer d'un autre tableau :
INSERT INTO table1 (ID, Name)
SELECT
ID,
Name
FROM table2
Ou même à partir de plusieurs tables :
INSERT INTO table1 (column2, column3)
SELECT
t2.column,
t3.column
FROM table2 t2
INNER JOIN table3 t3
ON t2.ID = t3.ID