2013-12-09 72 views
0

我一直在試圖導入數據(製表符分隔)到SQL服務器。源數據是從IBM Cognos導出的。數據可以從以下網址下載:sample dataBCP /批量插入失敗(製表符分隔文件)

我試過BCP/Bulk Insert,但它沒有幫助。原始數據文件包含一個標題行(需要跳過)。

================================== 模式:

CREATE TABLE [dbo].[DIM_Assessment](
[QueryType] [nvarchar](4000) NULL, 
[QueryDate] [nvarchar](4000) NULL, 
[APUID] [nvarchar](4000) NULL, 
[AssessmentID] [nvarchar](4000) NULL, 
[ICDCode] [nvarchar](4000) NULL, 
[ICDName] [nvarchar](4000) NULL, 
[LoadDate] [nvarchar](4000) NULL 
) ON [PRIMARY] 
GO 

== ===========================使用以下命令

bcp [dbname].dbo.dim_assessment format nul -c -f C:\config\dim_assessment.Fmt -S <IP> -U sa -P Pwd 

內容格式文件的生成 格式文件:

11.0 
7 
1  SQLCHAR    0  8000 "\t"  1  QueryType     SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR    0  8000 "\t"  2  QueryDate     SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR    0  8000 "\t"  3  APUID      SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    0  8000 "\t"  4  AssessmentID     SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    0  8000 "\t"  5  ICDCode      SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    0  8000 "\t"  6  ICDName      SQL_Latin1_General_CP1_CI_AS 
7  SQLCHAR    0  8000 "\r\n" 7  LoadDate      SQL_Latin1_General_CP1_CI_AS 

=============== ==============

我試圖使用BCP/Bulk Insert導入數據,但是,他們都沒有工作。

bcp [dbname].dbo.dim_assessment IN C:\dim_assessment.dat -f C:\config\dim_assessment.Fmt -S <IP> -U sa -P Pwd 

BULK INSERT dim_assessment FROM '\\dbserver\DIM_Assessment.dat' 
WITH (
    DATAFILETYPE = 'char', 
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\r\n' 
); 
GO 

預先感謝您的幫助@

+1

什麼是「他們沒有工作」是什麼意思?你收到錯誤信息了嗎?如果是這樣,那是什麼? –

+0

是的,目前我無法使用SSIS導入數據。我們正在尋找一種自動的方式將網絡上保存的數據導入SQL服務器。 – DataRiver

+2

我不確定該答覆如何回答我的任何問題。 –

回答

3

輸入文件是一個可怕的格式。

您的格式文件和您的BULK INSERT命令都聲明行的末尾應該是回車符和換行符組合,並且有七列數據。但是,如果您在記事本中打開CSV文件,您將很快看到在Windows中沒有正確觀察到回車符和換行符(這意味着它們必須是非精確的\r\n)。您還可以看到,有沒有實際數據的七列,但五:

QueryType QueryDate APUID AssessmentID ICDCode ICDName LoadDate 
PPIC 2013-11-20 10:23:14 11431 10963  Tremors 
PPIC 2013-11-20 10:23:14 11431 11299  THUMB PAIN 
PPIC 2013-11-20 10:23:14 11431 11348  Environmental allergies 
... 

Just looking at it visually you can tell it isn't right,你需要在SQL Server的把它扔在牆上,並期待它處理之前,以獲得更好的源文件它順利:

enter image description here

+0

我不知道該說些什麼。也許正如其他人所解釋的那樣,有些列缺失/空白,這就是爲什麼你看到這種不良格式的數據文件? – DataRiver

0

通過打開的Excel文件顯示以下內容:

  • 確實有7個標題
  • 其中只有前六個被填充
  • 列1,2和3保持相同的值
  • 有一些混亂的數據,其中,所述第五列可以是空的,或填寫數字或填寫文字。

我想,在這些情況下,批量插入可能無法正常工作。由於Excel似乎以相當乾淨的方式管理你的文件,你應該考慮一個額外的步驟,從CSV到Excel再到數據庫。

enter image description here

+0

哇,我很高興看到這一點。當你說應該有一個額外的步驟,有沒有辦法將製表符分隔的文件保存爲Excel中的「逗號」分隔文件,然後從命令行導入數據?如果發生這種情況,我是黃金! – DataRiver

+0

您應該嘗試通過Excel的「另存爲」選項。如果你可以手動完成,這意味着有一種方法可以通過編程來完成。簡單的T-SQL可能無法實現,但肯定有一些命令行軟件可用。只是谷歌它。 –

+0

我正在尋找!當我找到東西的時候,會在這裏發佈。謝謝 – DataRiver

2

剛纔保存文件爲.csv和批量插入下面的語句。

​​

返回的消息

(22587 row(s) affected) 

加載的數據

enter image description here

只需注意從ICD名字的一些數據已經溢出到LoadDate列,只需使用|管性格來消除並使用與FIELDTERMINATOR = '|'和歡樂日子相同的批量插入語句。

+0

添加分隔符(管道)可能不太可行。 – DataRiver

+0

您是否知道使用命令行中的「管道」保存此製表符分隔文件的方法,或者不需要手動干預的方法? – DataRiver

+1

該文件已被標記爲「.csv」,但採用製表符分隔的格式。你的意思是你在Excel中手動打開它,然後將它重新保存爲CSV?不幸的是,你不能每次都手動完成。真正的解決辦法是首先得到正確的輸出,所以你不必在兩者之間執行手動步驟...... –

0

好吧,所以,這是一個看似簡單的任務,將分隔數據從平面文件推送到SQL服務器。我認爲BCP是要走的路(我早些時候使用它併成功)。

建議內容的簡要說明: a。修復源文件 b。以本地Excel格式保存源數據 c。將源數據保存爲管道分隔數據

我嘗試了所有選項,但是它向我的進程添加了多個步驟,但是可以執行。

我偶然發現了來自powershell的invoke-sqlcmd & import-csv commandlets。事實證明,我可以直接使用powershell導入數據。現在有點慢,但我現在可以忍受這一點。

$DATA=IMPORT-CSV dim_assessment.CSV -Delimiter "`t" 

FOREACH ($LINE in $DATA) 

{ 
$QueryType="`'"+$Line.QueryType+"`'" 
$QueryDate="`'"+$Line.QueryDate+"`'" 
$APUID="`'"+$Line.APUID+"`'" 
$AssessmentID="`'"+$Line.AssessmentID+"`'" 
$ICDCode="`'"+$Line.ICDCode+"`'" 
    $ICDName=$Line.ICDName 
    $ICDName = $ICDName.replace("'","''") 
$ICDName="`'"+$ICDName+"`'" 
$LoadDate="`'"+$Line.LoadDate+"`'" 

$SQLHEADER="INSERT INTO [dim_assessment] ([QueryType],[QueryDate],[APUID],[AssessmentID],[ICDCode],[ICDName],[LoadDate])" 
$SQLVALUES="VALUES ($QueryType,$QueryDate,$APUID,$AssessmentID,$ICDCode,$ICDName,$LoadDate)" 

$SQLQUERY=$SQLHEADER+$SQLVALUES 
Invoke-Sqlcmd –Query $SQLQuery -ServerInstance HA -U sa -P Pwd 

} 

感謝您的幫助!