0

重複の可能性:
YYYYMM 形式の日付を MS SQL テーブルの日付フィールドに一括挿入する

SQL Server 2012 Express を使用しています。

YYYYMMDD 形式の日付を含むファイルから BULK INSERT を使用すると問題が発生します (形式を変更することはできません。別のソフトウェアからの出力です)。値を挿入するときにスキップする必要がある ID 列があるため、フォーマット ファイルを使用します。テーブル構造と 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.

日付を数値として一時テーブルに挿入せずに修正してから、他のテーブルで選択して日付に変換してください。私のコードには修正が必要です。

ありがとう!

4

2 に答える 2

3

問題が解決しました。使用しました

INSERT INTO daily 
SELECT a.* FROM OPENROWSET(
BULK 'C:\IBM.TXT',
FORMATFILE = 'C:\dailyformat.xml',
FIRSTROW = 2
) as a
于 2012-08-20T07:21:48.557 に答える
2

SET DATEFORMAT ymd「BULK INSERT」の前に電話してみてください

于 2012-08-16T11:47:12.370 に答える