批量导入 Azure
Bulk import into Azure
对于批量插入,我有一个数据文件和一个格式文件(xml);
- File.dat
- File.xml
这是在 OnPremises 中使用批量插入语句,但在 Azure 中格式文件似乎有问题。以下是我采取的步骤
设置存储访问权限
- 创建了共享访问签名
- 将容器访问策略设置为“Blob”(仅限 blob 的匿名读取访问)
为存储创建数据库范围的凭据
CREATE DATABASE SCOPED CREDENTIAL StorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'This is my secret' (Shared Access Signature Key)
创建外部数据源
CREATE EXTERNAL DATA SOURCE Storage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://<storagename>.blob.core.windows.net/<containername>',
CREDENTIAL = StorageCredential
);
文件查询(批量插入或 Openrowset)
BULK INSERT <Schema>.<Table>
FROM 'File.dat'
WITH (
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml'
)
或
SELECT * FROM OPENROWSET(
BULK 'File.dat',
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml'
) AS DataFile;
他们都没有处理错误;
'Cannot bulk load because the file is inclomplete or could not be read'
但是如果我能成功运行下面的查询;
SELECT * FROM OPENROWSET(
BULK 'File.xml',
DATA_SOURCE = 'Storage',
SINGLE_NClob) AS DataFile
使用 bcp 命令创建格式文件,指定格式参数并使用 nul 而不是 data-file 路径。 format 选项始终需要 -f 选项,要创建 XML 格式文件,您还必须指定 -x 选项。此外,对于此示例,限定符 c 用于指定字符数据,t 用于指定逗号作为字段终止符,T 用于指定使用集成安全性的可信连接。在命令提示符下,输入以下命令:
bcp TestDatabase.dbo.myFirstImport format nul -c -x -f D:\BCP\myFirstImport.xml -t, -T
在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
USE TestDatabase;
GO
TRUNCATE TABLE myFirstImport; -- (for testing)
INSERT INTO dbo.myFirstImport
SELECT *
FROM OPENROWSET (
BULK 'D:\BCP\myFirstImport.bcp',
FORMATFILE = 'D:\BCP\myFirstImport.xml'
) AS t1;
GO
-- review results
SELECT * FROM TestDatabase.dbo.myFirstImport;
我找到了答案,我会 post 自己解决(以防其他人也 运行 遇到这个问题)。
格式化文件的数据源需要单独指定。我尝试了微软文档中指定的方式; Bulk Insert
但是参数名有误。它指出正确的参数是 'FORMATFILE_DATASOURCE',但它应该是 'FORMATFILE_DATA_SOURCE'。 (这是在底部评论的)
BULK INSERT <Schema>.<Table>
FROM 'File.dat'
WITH (
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml',
FORMATFILE_DATA_SOURCE = 'Storage'
)
对于批量插入,我有一个数据文件和一个格式文件(xml);
- File.dat
- File.xml
这是在 OnPremises 中使用批量插入语句,但在 Azure 中格式文件似乎有问题。以下是我采取的步骤
设置存储访问权限
- 创建了共享访问签名
- 将容器访问策略设置为“Blob”(仅限 blob 的匿名读取访问)
为存储创建数据库范围的凭据
CREATE DATABASE SCOPED CREDENTIAL StorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'This is my secret' (Shared Access Signature Key)
创建外部数据源
CREATE EXTERNAL DATA SOURCE Storage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://<storagename>.blob.core.windows.net/<containername>',
CREDENTIAL = StorageCredential
);
文件查询(批量插入或 Openrowset)
BULK INSERT <Schema>.<Table>
FROM 'File.dat'
WITH (
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml'
)
或
SELECT * FROM OPENROWSET(
BULK 'File.dat',
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml'
) AS DataFile;
他们都没有处理错误;
'Cannot bulk load because the file is inclomplete or could not be read'
但是如果我能成功运行下面的查询;
SELECT * FROM OPENROWSET(
BULK 'File.xml',
DATA_SOURCE = 'Storage',
SINGLE_NClob) AS DataFile
使用 bcp 命令创建格式文件,指定格式参数并使用 nul 而不是 data-file 路径。 format 选项始终需要 -f 选项,要创建 XML 格式文件,您还必须指定 -x 选项。此外,对于此示例,限定符 c 用于指定字符数据,t 用于指定逗号作为字段终止符,T 用于指定使用集成安全性的可信连接。在命令提示符下,输入以下命令:
bcp TestDatabase.dbo.myFirstImport format nul -c -x -f D:\BCP\myFirstImport.xml -t, -T
在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
USE TestDatabase;
GO
TRUNCATE TABLE myFirstImport; -- (for testing)
INSERT INTO dbo.myFirstImport
SELECT *
FROM OPENROWSET (
BULK 'D:\BCP\myFirstImport.bcp',
FORMATFILE = 'D:\BCP\myFirstImport.xml'
) AS t1;
GO
-- review results
SELECT * FROM TestDatabase.dbo.myFirstImport;
我找到了答案,我会 post 自己解决(以防其他人也 运行 遇到这个问题)。
格式化文件的数据源需要单独指定。我尝试了微软文档中指定的方式; Bulk Insert
但是参数名有误。它指出正确的参数是 'FORMATFILE_DATASOURCE',但它应该是 'FORMATFILE_DATA_SOURCE'。 (这是在底部评论的)
BULK INSERT <Schema>.<Table>
FROM 'File.dat'
WITH (
DATA_SOURCE = 'Storage',
FORMATFILE = 'File.xml',
FORMATFILE_DATA_SOURCE = 'Storage'
)