2

6百万行のCSVファイルがあります。各行は同じ形式で構成されています。例:/BULK INSERTを使用してカラムをマップする

I,h,q,q,3,A,5,Q,3,[,5,Q,8,c,3,N,3,E,4,F,4,g,4,I,V,9000,0000001-100,G9999999990001800000000000001,G9999999990000001100PDNELKKMMCNELRQNWJ010, , , , , , ,D,Z 

私はテーブルに2列あります。

最初の列はCSVのフィールド27で、2番目の列はCSVファイルの行全体にする必要があります。

フォーマットファイルを設定しようとしましたが、動作できません。

このようなマッピングも可能ですか?ここで

は私が持っているものです。

BULK INSERT Staging FROM 'C:\Data.txt' 
    WITH 
    (
     FIELDTERMINATOR =',', 
     ROWTERMINATOR ='\n', 
     KEEPNULLS, 
     formatfile='C:\format.fmt' 
    ) 

これは比較の観点からは、私の形式のファイル

9.0 
2 
1  SQLCHAR  0  40  ","  27  Col27    SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR  0  200  "\r\n" 1  Col1    SQL_Latin1_General_CP1_CI_AS 

ですが、私は2分の35secsを取るのSQLiteでこの作業を持っています。

+0

それは可能ですか?はい。おそらく、あなたが試したことを含めることができ、誰かが問題を見つけることができるかもしれません。 –

+0

@TomH。質問が更新されました – Jon

+0

あなたは何をしようとしているのか分かりましたので、Chris Townsendが示唆しているように、仮のテーブルを使用する必要があります。 –

答えて

4

あなたはいくつかの方法このナットを割ることができますが、それはバルクにいた私がやった方法は、動的SQLを経由して一時テーブルにCSVファイル全体を挿入します。そして、あなたがにデータを挿入することができます

CREATE TABLE #BulkLoadData(
    RecordData NVARCHAR(max) 
) 


SET @SQL = 'BULK INSERT #BulkLoadData FROM ''' + @SourceFileFullPath + ''' ' 
SET @SQL = @SQL + 'WITH (FORMATFILE = ''' + @UPXInputFileBulkLoadFormat + 'UPXInputFileBulkLoadFormat.xml'', TABLOCK, ROWS_PER_BATCH = 2500) ' 

EXECUTE (@SQL) 

をこのようなターゲット表:

INSERT INTO dbo.TargetTable 
SELECT dbo.fnParseString(27, ',', RecordData), RecordData 

あなたがそうのような解析関数を作成する必要があります:

CREATE FUNCTION [dbo].[fnParseString] 
(
    @Section SMALLINT, 
    @Delimiter CHAR, 
    @Text VARCHAR(MAX) 
) 
RETURNS VARCHAR(8000) 
AS 

BEGIN 
DECLARE @startindex NUMERIC(18,0), 
    @length NUMERIC(18,0), 
    @FieldPosition INT 

SET @FieldPosition = ABS(@Section) - 1 
SET @startindex = 0 


WHILE @FieldPosition != 0 
BEGIN 
    SET @FieldPosition = @FieldPosition - 1 
    SET @startindex = CHARINDEX(@Delimiter, @Text, @startindex + 1) 
END  


SET @Text = SUBSTRING(@Text, @startindex + 1, LEN(@Text) - @startindex) 
SET @Text = SUBSTRING(@Text, 0, CHARINDEX(@Delimiter, @Text)) 

RETURN @Text 
END 

役立つことを願っています!フォーマットファイルに関する助けが必要な場合は、私に知らせてください。ここで

は、フォーマットファイルの内容です:

<?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="\n" MAX_LENGTH="8000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="RecordData" xsi:type="SQLVARYCHAR"/> 
    </ROW> 
</BCPFORMAT> 
+0

行全体が1つの列になるので、フォーマットファイルの助けが必要だと思う。フォーマットファイルを投稿しましたが、行全体の列が正しいかどうかはわかりません。私はこのアプローチについて考えましたが、サブセットを含むテーブルを挿入/更新するのは時間がかかりすぎると考えていました – Jon

+0

ターゲットテーブルに1つの列(RecordData)を一括して挿入し、 「その他」の列に値を設定します。 –

+0

私はステージングテーブルにバルク挿入を行ったばかりで、SQLiteよりも時間がかかりました。そうですか? – Jon

関連する問題