sql - Azure 从 Azure 文件服务位置将 csv 文件批量导入 Azure SQL Server

标签 sql sql-server csv azure-sql-database azure-storage

我想将一个 csv 文件 (sqlserver-dba-csv.txt) 导入到 Azure 中托管的 SQL Server 数据库的表中。

此文件位于 Azure 文件服务(位置地址:“https://XXXXXXXXXXX.file.core.windows.net/XXXXXXXXXXX/sqlserver-dba-csv.txt”)上,它也是我本地计算机上的映射驱动器。

最终我希望这可以通过触发器实现某种程度的自动化,但现在我只想将数据导入到 SQL 服务器上的表中以证明该过程有效。

此 sqlserver-dba-csv.txt 文件的内容是:

1,James Brown,blue 
2,Prince,red 
3,Rick James,yellow

我在 SSMS 上使用的代码是:

**--create a table
CREATE TABLE musicians_csv (
musician_id INT,
full_name VARCHAR(50),
colour VARCHAR(20)
)
GO
--bulk insert csv into a SQL Server table
BULK
INSERT musicians_csv
FROM 'https://XXXXXXXXXXX.file.core.windows.net/XXXXXXXXXXX/sqlserver-dba-csv.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
--Verify data inserted
SELECT *
FROM musicians_csv
GO
--Drop the table
DROP TABLE musicians_csv
GO**

我收到的错误信息是:

Msg 4861, Level 16, State 1, Line 10 Cannot bulk load because the file "https:/xxxxxxxxx.file.core.windows.net/xxxxxxxxx/sqlserver-dba-csv.txt" could not be opened. Operating system error code (null).

(0 row(s) affected)

我怀疑是文件所在位置的格式不对,但查找后没有找到任何解决办法。

或者 - 即使我的 SQL Server 位于 Azure 云中,我是否能够在本地计算机上引用和导入文件 - 例如位置如下:“C:\Users\user.name\Desktop\sqlserver -dba-csv.txt”

非常感谢任何帮助

最佳答案

您可能面临安全问题:如果文件未被声明为可以公开访问,Azure SQL 可能无权访问您尝试导入的文件。

当然,也许您不想将文件设置为对所有人都可用,因此您必须通过 CREATE CREDENTIAL 命令将凭证存储到 Azure SQL 中以访问它:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'A-$tr0ng|PaSSw0Rd!';
GO

CREATE DATABASE SCOPED CREDENTIAL [CSV-Storage-Credentials]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<shared-access-signature for "csvimportdemo" blob storage here>';
GO

CREATE EXTERNAL DATA SOURCE [CSV-Storage]
WITH 
( 
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://csvimportdemo.blob.core.windows.net',
    CREDENTIAL= [CSV-Storage-Credentials]
);

一旦完成,您就可以通过 BULK 命令访问该文件:

SELECT 
    FileId = ' + CAST(@fid AS NVARCHAR(9)) + ',
    FirstName, 
    LastName,   
    TwitterHandle
FROM OPENROWSET(
    BULK '<your file here>', 
    DATA_SOURCE = 'CSV-Storage',
    FIRSTROW=2,
    FORMATFILE='<your format file here>',
    FORMATFILE_DATA_SOURCE = 'Storage') as t

您可以在 github 上找到一个完整的工作示例(我发布的示例代码就是从那里获取的),它也使用 Azure 函数自动导入:

https://github.com/yorek/AzureFunctionUploadToSQL/blob/master/SQL/create-objects.sql

关于sql - Azure 从 Azure 文件服务位置将 csv 文件批量导入 Azure SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534267/

相关文章:

mysql - 查询返回null 找不到错误

SQL 查询语法错误 - 字段名称中的空格

mysql - 从csv执行sql字符串到mysql数据库

sql - SQL Server ROW_NUMBER()在哪些情况下不从1开始?

sql-server - 根据时间戳查询CosmosDB

sql - PIVOT 并插入每 N 行

json - 如何使用 ConvertTo-Json 将字符串转换为整数?

mysql - 在可空字段上定义的 MySql 唯一约束到底是如何工作的?

php - 使用 PHP 从 mysql 导出到 csv 时获取列名

r - 导入多个 csv 文件并为每个文件添加年份