【问题标题】:Importing a BCP file in Azure database在 Azure 数据库中导入 BCP 文件
【发布时间】:2017-05-19 18:11:19
【问题描述】:

我有一个 Azure 函数,它检索包含多个 BCP 文件的 zip 文件,该文件将它们解压缩并将它们添加为 blob。

我现在想将 BCP 文件导入我的 SQL 数据库,但不知道如何去做。我知道我可以使用以下脚本并运行 SqlCommand:

BULK INSERT RegPlusExtract.dbo.extract_class
FROM 'D:\local\data\extract_class.bsp'
WITH ( FIELDTERMINATOR = '@**@',ROWTERMINATOR = '*@@*')

但这显然不起作用,因为 SQL 服务器无法访问本地函数的 D: 驱动器。

我应该如何加载数据?是否可以将 BCP 文件加载到内存中,然后传递 SQLCommand?或者我可以将文件直接传递给 SQL 服务器吗?

我发现对于备份/恢复我可以做FROM URL = ''。如果我可以将它用于批量插入,那么我可以只引用 blob url,但看起来我不能?

【问题讨论】:

    标签: tsql azure azure-sql-database


    【解决方案1】:

    您将需要使用 BLOB 存储。以下是步骤,这些步骤记录在此处Microsoft/sql-server-samples

    --创建外部数据源

    CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
    WITH (  TYPE = BLOB_STORAGE, 
            LOCATION = 'https://sqlchoice.blob.core.windows.net/sqlchoice/samples/load-from-azure-blob-storage', 
    --      CREDENTIAL= MyAzureBlobStorageCredential    --> CREDENTIAL is not required if a blob storage is public!
    );
    

    您也可以将文件上传到容器并像下面这样引用它。这里第 3 周是一个容器

    CREATE EXTERNAL DATA SOURCE MyAzureInvoicesContainer
        WITH  (
            TYPE = BLOB_STORAGE,
            LOCATION = 'https://newinvoices.blob.core.windows.net/week3', 
            CREDENTIAL = UploadInvoices  
        );
    

    现在您可以像下面一样使用 OpenRowset 和 BulkInsert

    -- 2.1. INSERT CSV file into Product table
    BULK INSERT Product
    FROM 'product.csv'
    WITH (  DATA_SOURCE = 'MyAzureBlobStorage',
            FORMAT='CSV', CODEPAGE = 65001, --UTF-8 encoding
            FIRSTROW=2,
            TABLOCK); 
    
    -- 2.2. INSERT file exported using bcp.exe into Product table
    BULK INSERT Product
    FROM 'product.bcp'
    WITH (  DATA_SOURCE = 'MyAzureBlobStorage',
            FORMATFILE='product.fmt',
            FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage',
            TABLOCK); 
    
    -- 2.3. Read rows from product.dat file using format file and insert it into Product table
    INSERT INTO Product WITH (TABLOCK) (Name, Color, Price, Size, Quantity, Data, Tags) 
    SELECT Name, Color, Price, Size, Quantity, Data, Tags
    FROM OPENROWSET(BULK 'product.bcp',
                    DATA_SOURCE = 'MyAzureBlobStorage',
                    FORMATFILE='product.fmt',
                    FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as products; 
    
    -- 2.4. Query remote file 
    SELECT Color, count(*)
    FROM OPENROWSET(BULK 'product.bcp',
                    DATA_SOURCE = 'MyAzureBlobStorage',
                    FORMATFILE='data/product.fmt',
                    FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as data
    GROUP BY Color;
    

    【讨论】:

    • 我刚刚也找到了链接!这正是我所需要的,使将 URL 传递给 SQL Server 而不是传递数据更容易
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2016-03-05
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多