bulk insert不认csv路径主因是权限与位置问题:文件须存于sql server本地磁盘(如'c:\data\import.csv'),且服务账户需有读取权限;unc路径不支持,除非高危配置trustworthy on。

SQL Server里BULK INSERT不认CSV文件路径?先检查文件位置和权限
BULK INSERT 本身不解析CSV格式,它只按指定分隔符逐行读取文本——所以你看到“文件找不到”或“拒绝访问”,大概率不是语法问题,而是SQL Server进程(通常是 NT Service\MSSQLSERVER 或 NT AUTHORITY\SYSTEM)根本没权限访问那个路径。
- 文件必须放在数据库服务器本地磁盘上,不能用
\192.168.1.100\share\file.csv这类UNC路径(除非显式启用TRUSTWORTHY ON并配置代理账户,极不推荐) - 推荐路径:比如
C:\data\import.csv,然后在SQL中写成'C:\data\import.csv' - Windows服务账户需对该目录有读取权限(右键文件夹 → 属性 → 安全 → 添加对应SQL Server服务账户 → 勾选“读取”)
BULK INSERT导入CSV时字段错位?重点看FIELDTERMINATOR和ROWTERMINATOR
CSV常见坑是逗号出现在字段内容里(如 "Smith, John",25,"New York"),但 BULK INSERT 默认不支持引号包裹字段的解析。它只会机械地按 FIELDTERMINATOR 切割。
- 简单纯逗号分隔、无引号、无换行的CSV,可用:
BULK INSERT users FROM 'C:\data\users.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2 );
- 若含双引号包裹字段,
BULK INSERT无法自动剥离——要么预处理CSV去掉引号,要么改用OPENROWSET+FORMAT = 'CSV'(SQL Server 2017+) -
ROWTERMINATOR别硬写'\r\n':Windows记事本保存的CSV多为\r\n,但SQL Server有时只认'0x0a'(即\n),可尝试ROWTERMINATOR = '0x0a'
导入后数据全变成NULL或截断?检查列类型匹配和MAXERRORS设置
BULK INSERT 遇到类型不兼容(比如把字符串往 INT 列插)默认直接报错中断,但若目标列是 VARCHAR 而源数据超长,就会静默截断——你看不到错误,但数据已损坏。
- 先确认目标表结构与CSV列顺序、类型严格一致;如有日期列,确保CSV里是
2023-10-05格式而非05/10/2023 - 加上
MAXERRORS = 0强制暴露所有问题:MAXERRORS = 10会让前10条错数据被跳过,后续插入继续,极易掩盖格式问题 - 字符长度不够?临时把目标列改成
VARCHAR(8000)导入成功后再收缩,比反复试错快得多
想跳过标题行但FIRSTROW=2无效?确认文件实际换行符和空行
FIRSTROW = 2 表示从第2行开始读,但前提是文件第一行确实是标题,且没有BOM头、空行或不可见字符。
- 用Notepad++打开CSV → 编码菜单看是否为UTF-8 with BOM;BOM会导致第一行实际是乱码开头,
FIRSTROW计算失效 - 检查是否有空行:如果标题行后面跟了个空行,
FIRSTROW = 2会把空行当第二行读,结果全字段为NULL - 更稳妥的做法:导出CSV时去掉标题行,或用临时表接收全部数据,再用
INSERT INTO ... SELECT ... WHERE row_num > 1过滤
BULK INSERT快是真快,但它的“快”建立在对输入格式零容忍的基础上——少一个分隔符、多一个空格、错一位编码,都可能让整批数据偏移或静默失败。别急着跑命令,先用 TYPE C:\data\sample.csv 在服务器上原样看一眼真实内容。











