You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server使用OPENROWSET导入TXT文件无法导入全部行数问题

SQL Server 2016使用OPENROWSET导入TXT文件仅返回部分行的排查方案

首先你给出的示例脚本存在语法错误,缺少OPENROWSET的闭合括号,正确的语法结构参考:

select *
FROM OPENROWSET (
    BULK 'C:\SQL_DATA\VAR_REG_20190831.TXT', 
    FORMATFILE = 'C:\SQL_DATA\MR_VAR_REG.xml'
) AS t1;

如果语句实际可正常执行仅返回行数不符,可按以下优先级排查原因:

1. XML格式文件终止符配置不匹配

这是该类问题最常见的诱因:

  • 确认XML格式文件中<ROW TERMINATOR>的配置和源TXT的实际行尾完全一致:Windows生成的TXT默认行尾为\r\n,Linux/macOS生成的TXT默认行尾为\n,部分自定义导出工具可能使用其他特殊字符作为行分隔符。
  • 如果你配置的行/字段终止符恰好出现在某条记录的文本字段内容中,会导致SQL Server误判行/字段结束,后续内容错位解析,累计到一定行数后解析失败的内容会被静默丢弃。

2. 导入错误触发静默丢弃

OPENROWSET BULK导入默认MAX_ERRORS参数值为10,即累计10条解析错误后就会停止读取剩余内容,且不会抛出阻断级别的错误:
你可以修改语句参数定位错误位置:

SELECT *
FROM OPENROWSET (
    BULK 'C:\SQL_DATA\VAR_REG_20190831.TXT', 
    FORMATFILE = 'C:\SQL_DATA\MR_VAR_REG.xml',
    MAX_ERRORS = 0, -- 出现任意错误就终止执行并抛出报错
    FIRSTROW = 18950, -- 直接读取异常位置附近的行
    LASTROW = 18960
) AS t1;

执行后根据抛出的字段长度不匹配、格式错误等提示,就能定位到具体的异常行和配置问题。

3. SSMS结果集行数限制

如果你是直接执行SELECT语句查看结果而非插入到目标表,需要确认SSMS没有限制返回行数:
打开SSMS菜单栏工具->选项->查询结果->SQL Server->以网格显示结果,检查每批最多检索行数配置,如果值小于你的源文件行数,修改为0即可取消限制。

4. 源文件存在特殊控制字符

用Notepad++等支持查看不可见字符的编辑器打开源TXT,检查第18954行前后是否存在换页符、空字符、软换行等特殊控制符,这类字符会导致BULK读取时误判文件结束,停止读取后续内容。

5. 格式文件字段定义不匹配

检查XML格式文件中每个字段的长度、数据类型是否和源文件实际内容完全一致,比如你将某个字段定义为VARCHAR(10),但源文件中该字段实际存在长度超过10的内容,就会出现字段截断,导致后续所有字段解析错位,最终大量行解析失败被丢弃。


内容的提问来源于stack exchange,提问作者Antonio Calo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:48:02