批量导入 Azure

Bulk import into Azure

对于批量插入,我有一个数据文件和一个格式文件(xml);

这是在 OnPremises 中使用批量插入语句,但在 Azure 中格式文件似乎有问题。以下是我采取的步骤


设置存储访问权限

为存储创建数据库范围的凭据

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;

参考文档:Use a Format File to Bulk Import Data (SQL Server)

我找到了答案,我会 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'
)