我已经搜过了几次。有些帖子是相关的,但仍然无法帮助我解决这个问题。
以下是我的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值,其中应该有一些数据。我认为问题出在items.id = C.id
上,它无法读取items.txt中的每个值,但是当我使用此代码时:
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'
它返回:
0000100000 2
7005432111 2
4545213695 2
4545213612 2
0000100001 2
0000100002 2
谢谢!
修改 问题的解决方案在于格式文件" items.fmt" (@serverSentinel的信用)使用\ r \ n终止该行。
10.0
1
1 SQLCHAR 0 46 "\r\n" 1 loyaltyID SQL_Latin1_General_CP1_CI_AS
答案 0 :(得分: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
答案 1 :(得分:0)
绝对确定:
1)items.txt在UNIX行结尾(\ n)而不是Windows(\ r \ n)。这很可能是你的问题。
尝试使用此格式验证或使用可设置行模式的文本编辑器
10.0
1
1 SQLCHAR 0 46 "\r\n" 1 loyaltyID SQL_Latin1_General_CP1_CI_AS
2)正在以char(46)SQL_Latin1_General_CP1_CI_AS读入loyaltyID列。检查数据类型的长度和定义。您可能在将整数字段与char字段进行比较时遇到困难。适当地施展。不太可能,检查ansi_padding设置以确保您的varchar与char比较不比较额外的空格。检查您的排序规则。例如,SQL_Latin1_General_CP1_CI_AS与latin1_general_bin有很大不同。
如果这不能解决您的问题,请发布customerTable的架构和一些示例记录。