我正在使用 SQL Server 2012 Express。
我在使用包含格式为 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
bcp 生成的格式文件(dailyformat.xml)在这里:
<?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.
请帮助修复它,而不是将日期作为数字插入到临时表中,然后通过将其选择到其他表中将其转换为日期。我的代码应该有一些修复。
谢谢!