gpt4 book ai didi

sql - Azure blob 到 Azure SQL 数据库 : Cannot bulk load because the file "xxxx.csv" could not be opened. 操作系统错误代码 5(访问被拒绝。)

转载 作者:行者123 更新时间:2023-12-03 03:55:13 28 4
gpt4 key购买 nike

我正在尝试在 azure sql 数据库中批量加载 azure blob 存储中的一些数据。文件内容为:

 customer,age,gender
'C1093826151','4','M'
'C352968107','2','M'
'C2054744914','4','F'

该文件位于名为silver的容器中。在银色容器中,我有 File1.fmt,其内容是:

14.0  
3
1 SQLCHAR 0 7 "," 1 customer ""
2 SQLCHAR 0 100 "," 2 age SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "\r\n" 3 gender SQL_Latin1_General_CP1_CI_AS

我在 fmt 文件末尾添加了额外的行。

我已经创建了一个 SAS token ,将全部启用并允许,如下面的屏幕截图所示: enter image description here

datalake上的防火墙规则如下图:

enter image description here

下面是我的 sql 脚本(我删除了 SAS token 开头的 ?,因为我的银容器是公共(public)的,我知道我应该需要 SAS token ):

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'safepassword';
go
DROP EXTERNAL DATA SOURCE MyAzureInvoices

DROP DATABASE SCOPED CREDENTIAL UploadInvoices

CREATE DATABASE SCOPED CREDENTIAL UploadInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2019-12-12**********************************88%3D'; -- dl

--DROP EXTERNAL DATA SOURCE MyAzureInvoices

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

着陆台:

CREATE TABLE [ext].[customer](
[customer_id] [int] IDENTITY(1,1) NOT NULL,
[customer] [varchar](100) NOT NULL,
[age] [int] NOT NULL,
[gender] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

这些是我尝试将文件加载到 sql 数据库中的方法:

-- 1
SELECT * FROM OPENROWSET(
BULK 'bs140513_032310-demo.csv',
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
FORMATFILE='File1.fmt',
FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;
-- 2
go
SELECT * FROM OPENROWSET(
BULK 'bs140513_032310-demo.csv',
DATA_SOURCE = 'MyAzureInvoices',
SINGLE_CLOB) AS DataFile;
go
-- 3
BULK INSERT ext.customer
FROM 'bs140513_032310-demo.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices', FORMAT = 'CSV' );

它们都给出相同的错误:

Msg 4861, Level 16, State 1, Line 2
Cannot bulk load because the file "bs140513_032310-demo.csv" could not be opened. Operating system error code 5(Access is denied.).

我已经尝试了三天,但我迷失了。感谢您的帮助注意:

断开连接时,它可以访问文件:

*

mydatalake是假的,但我可以用实名访问

最佳答案

我认为此错误消息具有误导性。
我创建了与您相同的测试,并遇到了相同的错误。
但在我编辑 bs140513_032310-demo.csvFile1.fmt 后,它运行良好。

  1. 我像这样更改了 bs140513_032310-demo.csv: enter image description here

  2. 我像这样更改了File1.fmt,将客户列长度从7更改为100,将年龄列长度更改为从 100 到 7:

14.0  
3
1 SQLCHAR 0 100 "," 1 customer ""
2 SQLCHAR 0 7 "," 2 age SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "\r\n" 3 gender ""
  • 我使用以下语句来查询:
  •    SELECT * FROM OPENROWSET(
    BULK 'bs140513_032310-demo.csv',
    DATA_SOURCE = 'MyAzureInvoices',
    FORMAT = 'CSV',
    FORMATFILE='File1.fmt',
    FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
    ) AS DataFile;

    结果显示:
    enter image description here

  • 不要直接批量插入到您的真实表中。
    • 我总是会从 CSV 文件插入临时表 ext.customer_Staging(不带 IDENTITY 列)
    • 可能编辑/清理/操作您导入的数据
    • 然后使用如下 T-SQL 语句将数据复制到真实表:
    INSERT into  ext.customer_Staging with (TABLOCK) (customer, age, gender)
    SELECT * FROM OPENROWSET(
    BULK 'bs140513_032310-demo.csv',
    DATA_SOURCE = 'MyAzureInvoices',
    FORMAT = 'CSV',
    FORMATFILE='File1.fmt',
    FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
    ) AS DataFile;
    go

    INSERT INTO ext.customer(Name, Address)
    SELECT customer, age, gender
    FROM ext.customer_Staging

    关于sql - Azure blob 到 Azure SQL 数据库 : Cannot bulk load because the file "xxxx.csv" could not be opened. 操作系统错误代码 5(访问被拒绝。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64835887/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com