2010-08-25 69 views
2

我有一個名爲「sp_BulkInsert」的存儲過程,它將一個.csv文件插入到我的數據庫中,當您執行時指定文件的完整路徑它。我試圖創建另一個名爲「sp_ResultsDump」的存儲過程,在其中指定文件夾路徑,然後在文件夾中搜索所有.csv文件,創建一個帶有文件名的表,然後在執行「sp_BulkInsert」時循環遍歷該表的各行,爲文件夾中的每個.csv文件(其名稱記錄在上一個表格中)。T-SQL:創建獲取路徑文件夾並插入到文件路徑的存儲過程

下面是代碼:

--Step 0: Create Stored Procedure 
CREATE PROCEDURE sp_ResultsDump 
@PathFolder VARCHAR(2000) 
AS 

--Step 1: Create table of file names 
IF EXISTS (SELECT 1 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE='BASE TABLE' 
    AND TABLE_NAME='Files') 
    DROP TABLE Files 
CREATE TABLE Files(FileID INT IDENTITY NOT NULL, FileName VARCHAR(max)) 
DECLARE @PathExec VARCHAR(1000) 
SET @PathExec = "dir '"[email protected]+"'.csv /B" 
INSERT INTO Files(FileName) EXEC master..xp_cmdshell @PathExec 
DELETE Files WHERE FileName IS NULL 

--Step 2: Get # of files, declare and initialize iterator 
DECLARE @RowCount INT, @I INT 
SET @RowCount = (SELECT COUNT(FileName) FROM Files) 
SET @I = 1 

--Step 3: Loop through the rows of a table and execute sp_ResultsDump for each file 
WHILE (@I <= @RowCount) 
BEGIN 
     DECLARE @FileName VARCHAR(1000) 
     SELECT @FileName = FileName FROM Files WHERE FileID = @I 
     SELECT @FileName = @[email protected] 
     EXEC sp_BulkInsert @FileName 
     SET @I = @I + 1 
END 

我已經證實,當我指定的文件夾中(不創建存儲過程或動態@variable),然而存儲@PathFolder步驟1-3的工作似乎成爲問題。例如,我想抓取C:\中的所有.csv文件,並且每個通過循環的@FileName將遍歷表文件列FileName中包含的文件名。

我想要做的是能夠執行下面的代碼,這樣我可以得到一個指定的文件夾中所有的.csv文件,併成功地批量插入他們到我的數據庫:

EXEC sp_ResultsDump 'c:\' 

原因這是因爲文件夾路徑可能稍後會更改,我希望用戶能夠指定它。

我相信「SELECT @FileName = @ PathFolder + @ FileName」不正確,我嘗試了各種引號和+的組合。步驟1和3似乎都有@PathFolder的問題。

我想我只需要我的while循環的幫助,因爲我認爲如果我的while循環是正確的,這應該是好的。

有什麼建議嗎?簡單的語法錯誤的地方?提前致謝。

回答

2

我覺得你的問題是與以下SET命令

SET @PathExec = "dir '"[email protected]+"'.csv /B" 

這似乎是混合的雙引號和單引號。嘗試將其更改爲這個

SET @PathExec = 'dir "' + @PathFolder + '.csv" /B' 
+0

嘿謝謝回覆。我試着改變它,而且我仍然收到相同的錯誤信息。在處理遊標變量時,雙引號和單引號如何正確工作? 另外,下列有效嗎? SELECT @FileName =「'」+ @ PathFolder +「''」+ @ FileName +「'」 EXEC sp_BulkInsert @FileName – 2010-08-26 02:36:24

1
SET @PathExec = 'dir "' + @PathFolder + '.csv" /B' 

它似乎缺少*。嘗試將其更改爲此

SET @PathExec = 'dir "' + @PathFolder + '*.csv" /B' 

它對我來說工作得很好。否則使用這個:

EXEC master..xp_cmdshell ‘DIR C:\inbox\*.csv /b’