2010-07-17 7 views
16

Cela devrait être une question assez simple, mais je n'ai pas été en mesure de trouver une réponse solide en ligne. J'essaie d'insérer plusieurs lignes dans la même table, mais avec une seule instruction. Le plus populaire que j'ai vu en ligne est le suivant, mais j'ai lu que cela fonctionne uniquement avec SQL Server 2008:SQL Server 2005: Insérer plusieurs lignes avec une seule requête

INSERT INTO Table (Name, Location) VALUES 
('Name1', 'Location1'), 
('Name2', 'Location2'), 
('Name3', 'Location3'), etc... 

Je préfère cette méthode si cela va fonctionner avec SQL Server 2005, mais je ne le pense pas. L'autre option, d'après ce que j'ai lu, concerne les instructions SELECT de UNION ALL après l'INSERT, ce qui semble maladroit. Est-ce que quelqu'un sait à coup sûr la meilleure syntaxe pour le faire en 2005?

Merci.

Répondre

21

Oui. Vous devez utiliser UNION ALL s dans SQL Server 2005 pour insérer plusieurs lignes dans un script SQL dans une instruction unique.

INSERT INTO Table 
    (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 

L'autre alternative principale est de répéter plusieurs fois les déclaration Insert qui est encore plus bavard. Vous devez faire attention à utiliser les transactions explicites dans ce dernier cas pour éviter la surcharge de nombreux commits individuels (et pour des raisons d'atomicité bien sûr)

Si vous avez beaucoup de lignes à insérer, vous pouvez utiliser BULK INSERT pour charger le tout à partir d'un fichier délimité dans une déclaration.

Enfin, s'il s'agit déjà de données dans la base de données que vous envoyez (peut-être sur un autre serveur), l'addin SSMS Tools Pack dispose d'une fonction "Generate Insert Statements" qui peut générer ces instructions pour vous.

+1

Pour mémoire, cela vous dérangerait de taper un exemple en utilisant UNION TOUT? –

3

Vous devez utiliser le union all dans SQL Server 2005. Pour être honnête, c'est tellement maladroit et moche, je voudrais simplement utiliser plusieurs inserts si j'étais vous. Enveloppez-les dans une seule transaction et c'est la même chose à la fin.

1

Oui, ils sont vos seules options, à moins que vous insérez beaucoup de données et pourrait vouloir explorer un BULK INSERT

INSERT INTO Table (Name, Location) 
SELECT 'Name1', 'Location1' UNION ALL 
SELECT 'Name2', 'Location2' UNION ALL 
SELECT 'Name3', 'Location3' 
5

Comme d'autres l'ont dit, la clé est ici UNION ALL. Pour moi, utiliser un CTE permet de garder les choses un peu plus propres, par ex.

WITH NewStuff (Name, Location) 
    AS 
    (
     SELECT 'Name1', 'Location1' UNION ALL 
     SELECT 'Name2', 'Location2' UNION ALL 
     SELECT 'Name3', 'Location3' 
    ) 
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location 
    FROM NewStuff; 
0

Depuis MS SQL Server 2005 prend en charge XML la meilleure méthode que je suggère est une procédure stockée avec un paramètre d'entrée de type XML. Si vous travaillez avec .NET vous pouvez facilement convertir le DataSet chaîne XML en utilisant la méthode ds.GetXml() et peut être envoyé à la SP

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL) 
AS 
BEGIN 
    INSERT INTO [dbo].[TheLocations] 
     ([Name], [Location]) 
    SELECT 
     XTab.value('Name[1]','nvarchar(100)') AS[Name], 
     XTab.value('Location[1]','nvarchar(200)') AS[Location] 
    FROM @XML.nodes('TheLocations') XTab([XTab]) 
END 
Questions connexes