2010-10-29 18 views
26

J'ai une requête qui fonctionne très bien:insertion en bloc en utilisant la procédure stockée

BULK INSERT ZIPCodes 
FROM 'e:\5-digit Commercial.csv' 
WITH 
( 
    FIRSTROW = 2 , 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 

mais maintenant je veux créer une procédure stockée pour elle.

J'ai écrit ci-dessous code pour la procédure stockée:

create proc dbo.InsertZipCode 
@filepath varchar(500)='e:\5-digit Commercial.csv' 
as 
begin 
BULK INSERT ZIPCodes 
FROM @filepath 
WITH 
( 
    FIRSTROW = 2 , 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
end 

mais son erreur indiquant:

Msg 102, Level 15, State 1, Procedure InsertZipCode, Line 6 Incorrect syntax near '@filepath'.

Msg 319, Level 15, State 1, Procedure InsertZipCode, Line 7 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

S'il vous plaît me dire ce que je fais mal et ce que je peux faire pour le rendre travailler dans une procédure stockée.

Merci

Répondre

35

Il n'y a rien de mal avec votre code de procédure stockée - le point est: la commande BULK INSERT ne peut pas accepter un nom de fichier comme une variable.

Cela fonctionne:

mais cela ne fonctionne jamais - dans un proc stocké ou non:

DECLARE @filename VARCHAR(255) 
SET @filename = 'e:\5-digit Commercial.csv' 

BULK INSERT ZIPCodes 
FROM @filename 
WITH 

Donc, vous ne pouvez pas le faire de cette façon, malheureusement. Vous pouvez envisager de créer votre instruction BULK INSERT en tant que chaîne (avec un nom de fichier fixe), puis l'exécuter en tant que SQL dynamique - mais je ne vois pas vraiment d'autre solution.

DECLARE @filepath nvarchar(500) 
SET @filepath = N'e:\5-digit Commercial.csv' 

DECLARE @bulkinsert NVARCHAR(2000) 

SET @bulkinsert = 
     N'BULK INSERT ZIPCodes FROM ''' + 
     @filepath + 
     N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')' 

EXEC sp_executesql @bulkinsert 
+0

merci je l'ai déjà fait comme une chaîne et exécutez-le en utilisant exec mais je pensais qu'il pourrait y avoir d'autres solutions. Merci beaucoup. –

+0

marc_s mais puis-je exécuter EXEC sp_executesql @bulkinsert à partir de la procédure? donc mon interface C# appellera ma procédure SQL, passera les paramètres (chemin du fichier, nom de la table), et sa va créer une chaîne et appeler SQL dynamique? – Andrey

1

Vous venez de l'essayer, je pense que vous devez télécharger ce fichier CSV directement sur le lecteur 'E'. Pour cela, vous devez avoir des droits d'administrateur, je pense, ou demander à quelqu'un qui est dans l'administration de la base de données.

create procedure dbo.InsertZipCode 
AS 
BEGIN 
SET NOCOUNT ON; 
BULK 
    INSERT ZIPCodes from 'e:\5-digit Commercial.csv' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
END