2011-09-06 20 views
0

我需要使用OpenRowset函數將多個文件(file1,file2,file3 ...)上載到sql server數據庫中的表(表1,表2,表3 ...)。所有的文件保存在C:\ download 我使用下面的查詢,它工作正常。使用SQL Server上傳csv文件OpenRowSet函數

INSERT INTO dbo.Table1 
SELECT * from OpenRowset('MSDASQL','Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=C:\download;','select * from File1.csv') 

問題是如何傳遞文件名和表名作爲參數。


謝謝Tony的回答。我已經把sql存儲在一個存儲過程中,如下所示。但它比原始硬編碼文件和表名稱慢得多。任何建議使其運行速度更快。

ALTER proc [dbo].[ImportFiles] 

    @FilePath varchar(100) , 
    @FileName varchar(100), 
    @TableName varchar(250) 
AS 
BEGIN 
DECLARE @SqlStmt nvarchar(max) 
DECLARE @ErrorCode int 

SET @SqlStmt='Truncate table dbo.[' + @TableName +']' 
EXEC(@SqlStmt); 
-- i COULD PUT TRUNCATE statement in the sate statement as insert just before INSERT INTO. 
set @SqlStmt=N' 
INSERT INTO '[email protected]+N' 
select * 
from openrowset(''MSDASQL'' 
       ,''Driver={Microsoft Access Text Driver (*.txt, *.csv)}; 
        DefaultDir='[email protected]+N''' 
       ,''select * from "'[email protected]+N'"'')' 

    EXEC(@SqlStmt); 
+0

您是否有理由使用此方法導入數據?如果您有可用的SSIS,可能是更好的方式來執行多個文件導入。 – Tony

+0

原因基本上是我對SSIS的瞭解不多,但是我沒有成功。 – rao

+0

動態SQL通常較慢,但是您看到它減慢了多少?它慢了兩倍還是更多,這真的很重要嗎?如果整個過程需要幾分鐘的時間,那麼我不會擔心,花費數小時可能會有問題,但您多久執行一次導入? – Tony

回答

1

您將不得不使用動態SQL構建查詢,以將參數傳遞給OPENROWSET函數。然後可以將構建動態SQL的代碼放置在存儲過程中,以便於調用。

的代碼來創建SQL動態會是這樣的:

DECLARE @tableName varchar(10); 
DECLARE @importFile varchar(10); 
SET @tableName = 'Table1' 
SET @importQuery= 'File1.csv'; 
EXEC('INSERT INTO ' + @tableName + 'SELECT * from OpenRowset(''MSDASQL'',''Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=C:\download;'',''SELECT * FROM ' + @importFile + ''')' 

注:你必須檢查的報價是正確的,我沒有在時刻訪問SQL Server檢查語法。

+0

謝謝Tony的回答。 – rao