10

これがどのように起こっているのか理解できないようです。

これは、SQLServer2005に一括挿入しようとしているファイルの例です。

***A NICE HEADER HERE***
0000001234|SSNV|00013893-03JUN09
0000005678|ABCD|00013893-03JUN09
0000009112|0000|00013893-03JUN09
0000009112|0000|00013893-03JUN09

これが私の一括挿入ステートメントです:

BULK INSERT sometable
FROM 'E:\filefromabove.txt
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR= '|',
ROWTERMINATOR = '\n'
)

しかし、何らかの理由で私が得ることができる唯一の出力は次のとおりです。

0000005678|ABCD|00013893-03JUN09
0000009112|0000|00013893-03JUN09
0000009112|0000|00013893-03JUN09

ヘッダーを完全に削除してFIRSTROWパラメーターを使用しない限り、最初のレコードは常にスキップされます。これはどのように可能ですか?

前もって感謝します!

4

6 に答える 6

16

BULK INSERT/を使用して別の形式の行をスキップすることはできないと思いますBCP

これを実行すると:

TRUNCATE TABLE so1029384

BULK INSERT so1029384
FROM 'C:\Data\test\so1029384.txt'
WITH
(
--FIRSTROW = 2,
FIELDTERMINATOR= '|',
ROWTERMINATOR = '\n'
)

SELECT * FROM so1029384

私は得る:

col1                                               col2                                               col3
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
***A NICE HEADER HERE***
0000001234               SSNV                                               00013893-03JUN09
0000005678                                         ABCD                                               00013893-03JUN09
0000009112                                         0000                                               00013893-03JUN09
0000009112                                         0000                                               00013893-03JUN09

'|'が必要なようです ヘッダーデータでも、それまでは最初の列に読み込まれるため、改行を最初の列に飲み込みます。明らかに、フィールドターミネータパラメータを含める場合は、すべての行に1つが必要であると想定しています

前処理ステップで行を削除できます。もう1つの可能性は、完全な行のみを選択してから、それらを処理することです(ヘッダーを除く)。または、SSISなど、これを処理できるツールを使用します。

于 2009-06-22T21:19:06.017 に答える
9

たぶん、ヘッダーが実際のデータ行と同じ行末を持っていることを確認してください(で指定されているようにROWTERMINATOR)?

更新:MSDNから:

FIRSTROW属性は、列ヘッダーをスキップするためのものではありません。ヘッダーのスキップは、BULKINSERTステートメントではサポートされていません。行をスキップする場合、SQL Serverデータベースエンジンはフィールドターミネータのみを調べ、スキップされた行のフィールドのデータを検証しません。

于 2009-06-22T21:11:35.580 に答える
6

行全体を1つの列に読み込んでから、XMLを使用してデータを解析するのが最も簡単であることがわかりました。

IF (OBJECT_ID('tempdb..#data') IS NOT NULL) DROP TABLE #data
CREATE TABLE #data (data VARCHAR(MAX))

BULK INSERT #data FROM 'E:\filefromabove.txt' WITH (FIRSTROW = 2, ROWTERMINATOR = '\n')

IF (OBJECT_ID('tempdb..#dataXml') IS NOT NULL) DROP TABLE #dataXml
CREATE TABLE #dataXml (ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED, data XML)

INSERT #dataXml (data)
SELECT CAST('<r><d>' + REPLACE(data, '|', '</d><d>') + '</d></r>' AS XML)
FROM #data

SELECT  d.data.value('(/r//d)[1]', 'varchar(max)') AS col1,
        d.data.value('(/r//d)[2]', 'varchar(max)') AS col2,
        d.data.value('(/r//d)[3]', 'varchar(max)') AS col3
FROM #dataXml d
于 2013-08-07T20:12:08.280 に答える
0

以下のスニペットを使用できます

BULK INSERT TextData
FROM 'E:\filefromabove.txt'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '|',  --CSV field delimiter
ROWTERMINATOR = '\n',   --Use to shift the control to next row
ERRORFILE = 'E:\ErrorRows.csv',
TABLOCK
)
于 2019-01-25T10:53:45.307 に答える
0

SQLにquoteエスケープを処理させ、他のすべてにこれを実行させる

BULK INSERT Test_CSV
FROM  'C:\MyCSV.csv' 
WITH (
 FORMAT='CSV'
 --FIRSTROW = 2,  --uncomment this if your CSV contains header, so start parsing at line 2
);

他の回答に関しては、ここにも貴重な情報があります:

私はすべての答えでこれを見続けています:ROWTERMINATOR = '\n'
意味\nはLFであり、それはLinuxスタイルのEOLです

Windowsでは、EOLは2文字のCRLFで構成されているため、ROWTERMINATOR = '\r\n'

ここに画像の説明を入力してください

ここに画像の説明を入力してください

于 2020-11-20T03:24:24.260 に答える
-1

非SQLデータソースからSQLServerにBCPをインポートした後、一部のデータがどのように混乱するかを考えると、最初にすべてのBCPインポートをいくつかのスクラッチテーブルに実行することをお勧めします。

例えば

テーブルAddress_Import_tblを切り捨てます

BULK INSERT dbo.Address_Import_tbl FROM'E:\ external \ SomeDataSource \ Address.csv' WITH(FIELDTERMINATOR ='|'、ROWTERMINATOR ='\ n'、MAXERRORS = 10)

Address_Import_tblのすべての列がnvarchar()であることを確認して、可能な限り不可知論にし、型変換エラーを回避します。

次に、必要な修正をAddress_Import_tblに適用します。不要なヘッダーを削除するようなものです。

次に、INSERT SELECTクエリを実行して、必要なデータ型変換とともに、Address_Import_tblからAddress_tblにコピーします。たとえば、インポートされた日付をSQLDATETIMEにキャストします。

于 2014-02-06T16:43:45.110 に答える