Je sais que cela a déjà été fait il y a des années, mais je ne me souviens pas de la syntaxe, et je ne la trouve nulle part en raison de l'extraction de tonnes de documents d'aide et d'articles sur les "importations en bloc".
Voici ce que je veux faire, mais la syntaxe n'est pas tout à fait correcte ... S'il vous plaît, quelqu'un qui a déjà fait cela auparavant, aidez-moi :)
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
Je sais que c'est fermer à la bonne syntaxe. J'ai peut-être besoin de la parole "VRAC", ou de quelque chose dont je ne me souviens plus. Une idée?
J'ai besoin de cela 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 reçois Incorrect syntax near the keyword 'VALUES'.
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
Pour SQL Server 2008, vous pouvez le faire dans une clause VALUES exactement conformément à la déclaration de votre question (il vous suffit d'ajouter une virgule pour séparer chaque déclaration de valeurs) ...
Votre syntaxe fonctionne presque dans SQL Server 2008 (mais pas dans 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 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 j’estime 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 devez coder les données en dur, SQL 2008 et les versions ultérieures vous permettent de procéder comme suit ...
INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
Vous pouvez faire ceci (moche mais ça marche):
INSERT INTO dbo.MyTable (ID, Name)
select * from
(
select 123, 'Timmy'
union all
select 124, 'Jonny'
union all
select 125, 'Sally'
...
) x
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 et versions antérieures, vous devez répéter l'instruction VALUES.
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')
J'ai utilisé les éléments suivants:
INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10
Il ajoutera dix lignes avec des GUID uniques pour l'ID et le nom.
Remarque: ne mettez pas fin à la dernière ligne (GO 10) avec ';' car il va générer une erreur: Une erreur de script fatale s'est produite. Une syntaxe incorrecte a été rencontrée lors de l'analyse de 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)
Il serait plus facile d’utiliser XML dans SQL Server pour insérer plusieurs lignes, sinon cela deviendrait très fastidieux.
Voir 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 sur le serveur SQL pour afficher un exemple.
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)
Correspondant à INSERT (Transact-SQL) (SQL Server 2005), vous ne pouvez pas omettre INSERT INTO dbo.Blah
et vous devez le spécifier à chaque fois ou utiliser une autre syntaxe/approche,
Cela permettra de réaliser 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 depuis une autre table:
INSERT INTO table1 (ID, Name)
SELECT
ID,
Name
FROM table2
Ou même 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
Cela fonctionne très rapidement et efficacement 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’instruction 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 # en 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();
}