不能使用openrowset进行多次插入

Can't multiple insert using openrowset

我已经搜索过几次了。有些 post 是相关的,但仍然无法帮助我解决这个问题。

这是我的 items.txt 的示例项目。我查看了.txt文件,绝对没有白色space,等等

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

它 return 的值是:

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

它return 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'

它return是这样的:

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
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) 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) loyaltyID 列正在作为 char(46) SQL_Latin1_General_CP1_CI_AS 读入。检查数据类型的长度和定义。您可能难以将整数字段与字符字段进行比较。适当投射。不太可能,检查 ansi_padding 设置以确保您的 varchar 与 char 比较不会比较额外的空格。检查你的排序规则。例如 SQL_Latin1_General_CP1_CI_AS 与 latin1_general_bin 有很大不同。

如果这不能解决您的问题,请post customerTable 的架构和一些示例记录。