2016-09-13 4 views
1

私はすでに数回検索しました。いくつかの投稿は関連していますが、この問題について私はまだ助けてくれません。openrowsetを使用して複数挿入できない

ここに私のitems.txtのサンプルアイテムがあります。私は.txtファイルをチェックし、何の空白は絶対にありません、など

0000100000 
7005432111 
4545213695 
4545213612 
0000100001 
0000100002 

だからここに私のコードは、これまでのところです:

INSERT INTO items(id, customerID) 
SELECT items.id , C.customerID 
    FROM OPENROWSET(BULK N'C:\items.txt', FORMATFILE='C:\items.fmt') AS items 
    LEFT JOIN customerTable AS C ON items.id = C.id 

そしてそれは、この値を返します。

0000100000 NULL 
7005432111 NULL 
4545213695 NULL 
4545213612 NULL 
0000100001 NULL 
0000100002 NULL 

これは、そこにいくつかのデータがあるはずのcustomerID列にNULL値を返します。

0000100000 2 
7005432111 2 
4545213695 2 
4545213612 2 
0000100001 2 
0000100002 2 

ありがとう:

INSERT INTO items(id, customerID) 
SELECT items.id , C.customerID 
    FROM OPENROWSET(BULK N'C:\items.txt', FORMATFILE='C:\items.fmt') AS items 
    LEFT JOIN customerTable AS C ON C.id = '0000100000' 

それは、これを返します。私はこの問題は、それがitems.txtから各値を読み取ることができませんが、私はこのコードを使用する場合items.id = C.id上だと思います!

EDIT:問題を解決するには、(@serverSentinelにクレジット)形式のファイル "items.fmt" にある 使用\ rを\ n個の行を終了します。

10.0 
1 
1  SQLCHAR    0  46  "\r\n"  1  loyaltyID     SQL_Latin1_General_CP1_CI_AS 
+0

「customerTable」のサンプルデータを追加できますか –

+0

私のVMはちょうどハングアップしているため、確認できません。しかし、ここにいくつかのデータがあります: 'customerID、customerName、id' ' 2、Paulo、0000100000' – Cyberpau

+0

'items.txt'ファイルの先頭に空白がありますか? –

答えて

0

の絶対に確認してください:items.txtはUNIXの改行(\ n)がないのWindows(\ Rの\ nの)である)

1。これはおそらくあなたの問題です。

loyaltyID列がCHAR(46)順序SQL_Latin1_General_CP1_CI_ASとして読み出されている)

10.0 
1 
1  SQLCHAR    0  46  "\r\n"  1  loyaltyID     SQL_Latin1_General_CP1_CI_AS 

2線モードを設定することができるテキストエディタを確認または使用するには、このフォーマットを試してください。長さと定義のデータ型を確認してください。整数フィールドとcharフィールドを比較するのが難しいかもしれません。適切にキャストします。おそらく、ansi_paddingの設定をチェックして、varcharとcharの比較が余分なスペースを比較していないことを確認してください。照合を確認してください。たとえば、SQL_Latin1_General_CP1_CI_ASはlatin1_general_binとは大きく異なります。

これで問題が解決しない場合は、customerTableのスキーマといくつかのサンプルレコードを投稿してください。

+0

私は列を更新しようとしましたが、それも機能しません。しかし、フォーマットターミネータを '\ r \ n'で変更したときに動作します!驚くばかり。私の他の問題をチェックしよう。後でエラー/バグがなければ、これを答えとしてマークします。どうもありがとう@serverSentinel – Cyberpau

+0

これは本当にうまくいきます!どうもありがとうございます! – Cyberpau

0
My Text File Data(Store ProcessId) :- 

21 
22 
23 
24 


CREATE TABLE temp (ProcessId VARCHAR(2000)) ; 
BULK INSERT dbo.temp 
    FROM 'D:\items.txt' 
    WITH 
    (
     CODEPAGE = '1252', 
     FIELDTERMINATOR = ';', 
     CHECK_CONSTRAINTS 
    ) 
SELECT * 
FROM temp 
     INNER JOIN dbo.Process_Master ON Process_Id = ProcessId 
+0

私はバルクインサートを使ってみましたが、 'openrowset bulk'はより柔軟です。そして、これはどうやって私を助けますか?ありがとう – Cyberpau

+0

そのファイルとテンポラリテーブルのデータを格納するので、あなたは結合や条件などのテーブルで簡単に作業することができます。 –

+0

ええ、私の問題はまさにジョインです。上のコードでわかるように、 'items.id'の値を正しく取得できないようです。だから、ループを作るのが解決策だと私は思いますか? – Cyberpau

関連する問題