2010-10-29 31 views
26

saklı kullanarak ben iyi çalışıyor bir sorgu var:Toplu ekleme işlemi

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

ama şimdi bunun için bir saklı yordam oluşturmak istiyorum.

Ben onun saklı yordam yapmak için kod aşağıda yazdım

:

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 

ama onun gösteren hatası:

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.

ben yanlış yapıyorum söyle ve bunu yapmak için ne yapabilirim lütfen saklı yordamda çalışmak.

Teşekkür

cevap

35

sizin saklı yordam kodu ile yanlış bir şey yok - noktasıdır: BULK INSERT komutu bir değişken olarak bir dosya adı kabul edemez.

Bu yaptığı işlerde:

ama bu işleri asla - saklı yordam veya olmasın içinde:

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

BULK INSERT ZIPCodes 
FROM @filename 
WITH 

Yani sadece maalesef bu şekilde yapamaz. BULK INSERT ifadenizi bir dize olarak (sabit dosya adıyla) oluşturmayı ve sonra bunu dinamik SQL olarak yürütmeyi düşünebilirsiniz - ancak başka bir çözüm görmüyorum.

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

Zaten bunu bir dizgi olarak yaptım ve exec kullanarak çalıştırdığın için teşekkür ederim ama başka çözümler olabileceğini düşündüm. çok teşekkürler. –

+0

marc_s ama prosedürden EXEC sp_executesql @bulkinsert'i çalıştırabilir miyim? Bu yüzden C# arayüzüm SQL prosedürümü arayacak, parametreleri (dosya yolu, tablo adı) iletecek ve onun dizesi oluşturacak ve dinamik SQL'i arayacak mı? – Andrey

1

Sadece bunu denediğinizde, bu CSV dosyasını doğrudan 'E' sürücüsüne yüklemeniz gerektiğini düşünüyorum. Bunun için yönetici haklarına sahip olmanız gerektiğini düşünüyorum, ya da veritabanı yönetiminde olan birine sorun.

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