无法使用openrowset

时间:2016-09-13 01:25:50

标签: sql sql-server 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值,其中应该有一些数据。我认为问题出在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

2 个答案:

答案 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的架构和一些示例记录。