使用格式文件向Azure SQL批量导入CSV时遇文件无法打开错误
问题描述
- 尝试用Blob存储账户中的格式文件,将CSV批量导入Azure SQL数据库,执行语句:
BULK INSERT dbo.MyTable FROM 'MyCSV.csv' WITH(DATA_SOURCE = 'MyBlobStorageAccount' , FIRSTROW = 2 , CODEPAGE = '65001' , FORMATFILE = 'MyFormatFile.xml' );
- 报错信息:
Cannot bulk load because the file "MyFormatFile.xml" could not be opened. Operating system error code (null).
- 已验证的情况:
- 可成功导入同一存储账户内无需格式文件的其他文件
- 可通过以下语句将
MyFormatFile.xml内容导入临时表,排除权限/凭据问题:
IF(OBJECT_ID('tempdb..#data') IS NOT NULL) DROP TABLE #data CREATE TABLE #data ( data VARCHAR (MAX) ) BULK INSERT #data FROM 'MyFormatFile.xml' WITH (DATA_SOURCE = 'MyBlobStorageAccount', FIRSTROW = 1)
问题原因与解决方案
问题出在FORMATFILE参数的写法上:当通过DATA_SOURCE指定Blob存储时,该参数不会默认使用这个数据源,而是会尝试在本地文件系统查找格式文件,导致找不到文件报错。
有两种修正方式:
方式1:使用Blob存储的完整URL指定格式文件
BULK INSERT dbo.MyTable FROM 'MyCSV.csv' WITH( DATA_SOURCE = 'MyBlobStorageAccount', FIRSTROW = 2, CODEPAGE = '65001', FORMATFILE = 'https://<你的存储账户名>.blob.core.windows.net/<容器名>/MyFormatFile.xml' );
方式2:用「数据源名::文件名」的格式关联外部数据源
BULK INSERT dbo.MyTable FROM 'MyCSV.csv' WITH( DATA_SOURCE = 'MyBlobStorageAccount', FIRSTROW = 2, CODEPAGE = '65001', FORMATFILE = 'MyBlobStorageAccount::MyFormatFile.xml' );
内容的提问来源于stack exchange,提问作者Woody
相关产品推荐
相关产品推荐

