不能使用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 的架构和一些示例记录。
我已经搜索过几次了。有些 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 的架构和一些示例记录。