远程SQL Server执行BULK INSERT报错:无法打开本地文件
解决远程SQL Server通过BULK INSERT访问本地CSV的问题
问题根源
你遇到的核心问题是:BULK INSERT是在远程SQL Server服务器端执行的命令,它会尝试在服务器的文件系统里找/home/user/Downloads/data1.csv这个路径,而不是你本地Ubuntu机器的路径。哪怕你本地文件权限全开,远程服务器根本访问不到你本地的文件,所以才会报"找不到路径"的错误。
可行解决方案(无需把文件放到远程服务器)
方案1:用DataGrip自带的可视化导入功能(最简便)
DataGrip作为客户端工具,可以直接读取你本地的CSV文件,再把数据发送到远程SQL Server,完全绕开服务器端的文件访问限制:
- 打开DataGrip,连接到你的远程SQL Server实例
- 在左侧数据库导航栏,右键点击你要导入数据的数据库(或者直接右键临时表对应的
tempdb),选择 Import Data - 在弹出的向导里,选择本地的
/home/user/Downloads/data1.csv文件 - 跟着向导配置字段分隔符(逗号)、行分隔符(换行),映射好临时表的
id和classCode字段 - 确认配置后执行导入即可
方案2:用bcp命令行工具(适合自动化场景)
如果你习惯用命令行,可以用SQL Server的bcp客户端工具(Ubuntu上可以通过apt install msodbcsql18安装),直接把本地CSV推送到远程SQL Server的临时表:
- 先在DataGrip里创建临时表:
(注意:临时表是会话级的,要确保bcp和DataGrip用同一个连接会话,或者改成全局临时表CREATE TABLE #TempNullClass ( id nvarchar(10), classCode nvarchar(10) );##TempNullClass) - 在Ubuntu终端执行bcp命令:
参数说明:bcp "tempdb.dbo.#TempNullClass" in /home/user/Downloads/data1.csv -S <你的远程服务器地址> -U <用户名> -P <密码> -c -t, -r\n-c:用字符格式导入-t,:字段分隔符为逗号-r\n:行分隔符为换行
方案3:用OPENROWSET(需要服务器权限)
如果你的远程SQL Server允许配置Ad Hoc Distributed Queries,可以用OPENROWSET结合本地文件,但这个需要服务器端开启相关配置,且可能有安全限制,步骤相对复杂,不太推荐除非你有服务器管理员权限。
内容的提问来源于stack exchange,提问作者Oleksandr Stefanovskyi




