【问题标题】:SQL Server: BULK INSERT from file that contains dates in format YYYYMMDD [duplicate]SQL Server:从包含格式为 YYYYMMDD 的日期的文件中批量插入 [重复]
【发布时间】:2012-08-16 11:26:11
【问题描述】:

可能重复:
bulk insert a date in YYYYMM format to date field in MS SQL table

我正在使用 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.

请帮助修复它,不要将日期作为数字插入到临时表中,然后通过将其选择到其他表中将其转换为日期。我的代码应该有一些修复。

谢谢!

【问题讨论】:

    标签: sql sql-server bulkinsert date-format bcp


    【解决方案1】:

    问题解决了。我用过

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

    【讨论】:

    • 不要忘记接受你自己的答案。
    • 这种方法对于日期和数字处理都是稳健的。带有批量导入功能的内置数据转换看起来很粗糙,而普通的 DML 非常擅长从字符串进行类型转换。此外,这种方法可以让您将文件转换与插入分开,以便更容易看到发生了什么。
    【解决方案2】:

    尝试在“批量插入”之前调用SET DATEFORMAT ymd

    【讨论】:

    • 不幸的是没有帮助。顺便说一句,YYYYMMDD 应该是默认的日期格式,与 YYYY-MM-DD 相同。根据msdn.microsoft.com/en-us/library/bb630352,它们都与 ISO 8601 兼容。
    • 这解决了我的问题。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多