2010-05-13 56 views
0

我必須從文本文件(製表符分隔)每天在數據庫中插入新記錄。 我試圖使這個存儲過程與文件的參數從中讀取數據。在sql server db中導入txt的存儲過程db

CREATE PROCEDURE dbo.UpdateTable 

    @FilePath 

    BULK INSERT TMP_UPTable 
    FROM @FilePath 
    WITH 
    ( 
     FIRSTROW = 2, 
     MAXERRORS = 0, 
     FIELDTERMINATOR = '\t', 
     ROWTERMINATOR = '\n' 
    ) 

    RETURN 

然後,我會從我的代碼(C#)指定要插入的文件調用此存儲過程。

這顯然不起作用,所以我該怎麼做?

只是爲了清楚這裏的問題是,我不能通過參數@FilePathFROM條款,或者至少我不知道如何。

+0

爲什麼你需要這樣做。可能你可以使用SSIS,BulkCopy或BCP至少... – Incognito 2010-05-13 10:29:43

+0

,因爲數據庫將由多個用戶誰沒有sql服務器訪問更新,他們只會提供一個txt文件,應用程序將插入到數據庫。 (首先進入臨時表,執行一些檢查並最終追加到另一個表) – Iulian 2010-05-13 10:43:16

+0

好吧,但我發現使用SSIS加載文件沒有問題。不知何故,這些文件將被傳遞給某個目錄。我的意思是你可以從那裏加載那些文件。如果情況並非如此,請提供更多細節。 – Incognito 2010-05-13 10:48:16

回答

1

對不起,我誤解了。 您需要動態創建的SQL語句,然後執行它:

CREATE procedure dbo.UpdateTable 

    @FilePath varchar(max) 
AS 

declare @sql varchar(max) 
declare @parameters varchar(100) 
set @parameters = 'FIRSTROW = 2, MAXERRORS = 0, FIELDTERMINATOR = ''\\t'', ROWTERMINATOR = ''\\n'' ' 
SET @SQL = 'BULK INSERT TMP_UPTable FROM ' + @FilePath + @parameters 

EXEC (@SQL) 

RETURN 
+0

這正是我所期待的。 我想我現在還有一些其他類型的問題: 「批量加載失敗,行1列1的數據文件中的列太長。請驗證字段終止符和行終止符是否指定正確。 – Iulian 2010-05-13 12:09:30

+0

也許需要對「set @parameters = ...」進行一些調整。 – simon831 2010-05-13 12:11:35

+0

我正在看我的文本文件 - 數據由選項卡(十六進制$ 9)分隔,但在行的末尾我有同樣的事情。 也許分隔符沒有正確轉義,我試過''\ t'',並且我得到了相同的錯誤 – Iulian 2010-05-13 12:13:56

0

很抱歉,如果我遲到了這裏,但我會建議不同的方法 - 在C#應用程序中打開文件,並將其轉換爲更多的東西SQL友好的,DataTable甚至XML。在C#中,您可以完全控制解析文件的方式。然後編寫存儲過程以接受您的DataTable或XML。 DataTable更可取,但不能與Entity Framework一起使用。

有許多關於如何通過加入這種輸入來完成插入的幫助,並且SQL Server已針對集合操作進行了優化。