2012-08-16 86 views
0

Possible Duplicate:
bulk insert a date in YYYYMM format to date field in MS SQL tableSQL服務器:從文件BULK INSERT

我使用SQL Server 2012的快遞,其中包含YYYYMMDD格式的日期。

我在使用包含日期格式爲YYYYMMDD(無法更改格式,它是來自不同軟件的輸出)的日期的文件中使用BULK INSERT時出現問題。我使用格式文件,因爲我有一個標識列,插入值時應該跳過。表結構和BULK INSERT命令在這裏:

CREATE TABLE [dbo].[daily](
[id] [bigint] IDENTITY(1,1) NOT NULL, 
[ticker] [varchar](15) NOT NULL, 
[ddate] [date] NOT NULL, 
[dopen] [decimal](16, 8) NOT NULL, 
[dhigh] [decimal](16, 8) NOT NULL, 
[dlow] [decimal](16, 8) NOT NULL, 
[dclose] [decimal](16, 8) NOT NULL, 
[dvol] [int] NOT NULL, 
[dopenint] [int] NOT NULL 
); 


BULK INSERT daily 
FROM 'C:\IBM.TXT' 
WITH (
FORMATFILE = 'C:\dailyformat.xml', 
TABLOCK, 
FIRSTROW = 2); 

製表符分隔的數據文件(IBM.TXT)是在這裏:

Symbol Date  Open High Low  Close Total Volume Total Open Interest 
IBM 19620102  2.57000000 2.57000000 2.54000000 2.54000000 11704   0 
IBM 19620103  2.54000000 2.56000000 2.54000000 2.56000000  8778   0 
IBM 19620104  2.56000000 2.56000000 2.54000000 2.54000000  7878   0 
IBM 19620105  2.53000000 2.53000000 2.48000000 2.49000000 11029   0 
IBM 19620108  2.49000000 2.49000000 2.42000000 2.44000000 16431   0 
IBM 19620109  2.45000000 2.50000000 2.45000000 2.47000000 14855   0 

格式文件(dailyformat.xml),由BCP所產生,是在這裏:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="15"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="11"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="41"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="41"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="41"/> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="41"/> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="12"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="12"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="ticker" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="2" NAME="ddate" xsi:type="SQLDATE"/> 
    <COLUMN SOURCE="3" NAME="dopen" xsi:type="SQLDECIMAL" PRECISION="16" SCALE="8"/> 
    <COLUMN SOURCE="4" NAME="dhigh" xsi:type="SQLDECIMAL" PRECISION="16" SCALE="8"/> 
    <COLUMN SOURCE="5" NAME="dlow" xsi:type="SQLDECIMAL" PRECISION="16" SCALE="8"/> 
    <COLUMN SOURCE="6" NAME="dclose" xsi:type="SQLDECIMAL" PRECISION="16" SCALE="8"/> 
    <COLUMN SOURCE="7" NAME="dvol" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="8" NAME="dopenint" xsi:type="SQLINT"/> 
</ROW> 
</BCPFORMAT> 

我得到以下錯誤:

Msg 206, Level 16, State 2, Line 1 
Operand type clash: numeric is incompatible with date. 

請幫助修復它而不將日期作爲編號插入到臨時表中,然後通過將其選擇到其他表中將其轉換爲日期。應該有一些修復我的代碼。

謝謝!

回答

3

問題已解決。我用

INSERT INTO daily 
SELECT a.* FROM OPENROWSET(
BULK 'C:\IBM.TXT', 
FORMATFILE = 'C:\dailyformat.xml', 
FIRSTROW = 2 
) as a 
+0

然後不要忘記接受你自己的答案。 – j0k 2012-08-20 11:27:36

+0

當然,謝謝! – user1603038 2012-08-22 06:28:24

+0

這種方法對日期和數字處理都很有效。使用批量導入設施的內置數據轉換看起來非常粗糙,而普通的DML非常擅長從字符串類型轉換。此外,此方法可讓您從插入文件中分離文件轉換,以便更容易地看到發生了什麼。 – 2014-08-25 06:22:07

0

嘗試在「BULK INSERT」之前撥打SET DATEFORMAT ymd

+0

不好意思。 YYYYMMDD應該是YYYY-MM-DD的默認日期格式。根據http://msdn.microsoft.com/en-us/library/bb630352他們都是ISO 8601兼容。 – user1603038 2012-08-16 11:55:33