首页 > 数据库 >Azure SQL Managed Instance (3) 把本地Excel文件通过OPENROWSET导入到Azure SQL Managed Instance

Azure SQL Managed Instance (3) 把本地Excel文件通过OPENROWSET导入到Azure SQL Managed Instance

时间:2022-10-12 21:14:09浏览次数:85  
标签:文件 Managed MI Instance 导入 SQL Azure CSV

  《Windows Azure Platform 系列文章目录

 

  本文介绍如何使用Azure Blob Storage,把本地Excel文件导入到Azure SQL MI

  在使用SQL MI的时候,通常会把本地Excel文件导入到Azure SQL MI,都会通过服务器路径进行上传,比如下面一句话:

INSERT INTO  dbo.orderdetails
select *,createtime=GETDATE()
from Openrowset('Microsoft.ACE.OLEDB.12.0',
                 'EXCEL 12.0;HDR=YES;User id=admin;Password=;IMEX=1;DATABASE=D:\order.xlsx',
                 'select * from [Sheet1$]')
WHERE [orderid] IS NOT NULL;

  但是我们在使用Azure SQL MI的时候,SQL MI并不知道C盘、D盘这些路径,这时候就需要把文件上传到Azure Blob Storage来进行导入操作

 

  主要步骤:

  第一步:Excel文件不能直接上传到SQL MI,必须转换为csv文件

  第二步:将CSV文件到Azure SQL MI数据表 (第一次导入CSV文件时需要,主要为了生成Format文件,后续有了Format文件就无需执行第二步,直接执行第四步通过T-SQL语句导入)

  第三步:需要通过bcp命令,导出数据表文件为Format文件 (第一次导入CSV文件时需要,主要为了生成Format文件,后续有了Format文件就无需执行第二步,直接执行第四步通过T-SQL语句导入)

  第四步:将CSV文件和Format上传到Azure Blob,并通过T-SQL语句导入

 

  接下来进入我们的演示步骤:

  第一步:Excel文件不能直接上传到SQL MI,必须转换为csv文件,步骤略。

 

  第二步:将CSV文件到Azure SQL MI数据表 (第一次导入CSV文件时需要,主要为了生成Format文件,后续有了Format文件就无需执行第二步,直接执行第四步通过T-SQL语句导入)

  1.我们打开SQL Server Management Studio,连接到SQL MI,步骤略。

  2.点击Database,右键点击TASK,Import Data,如下图:

  

  3.在Choose a Data Source窗口中,选择Flat File Source,然后点击Browse选择本地的CSV文件,进行上传

  

 

  4.在SQL Server Import and Export Wizard窗口中,我们点击Properties

  

  

  5.在弹出的窗口中,输入SQL MI登录的用户名、密码和需要导入的Database。如下图:

  

 

  6.下图中,点击Next

  

 

  7.下图中,点击Run Immediately

  

 

  8.查看导入进度,如下图:

  

 

  9.导入成功后,我们在SQL MI可以查看到已经导入成功的Table,如下图dbo.testcsv:

  

 

  第三步:需要通过bcp命令,导出数据表文件为Format文件 (第一次导入CSV文件时需要,主要为了生成Format文件,后续有了Format文件就无需执行第二步,直接执行第四步通过T-SQL语句导入)

  1.我们打开本地CMD命令行,输入

where bcp.exe

  

 

  2.cd进入到bcp.exe所在的目录,然后执行下面的命令:

bcp [dbname].[schema].[tablename] format nul -c -f [fmt文件本地路径] -t,  -U "[登录数据库的用户名]" -P "[登录数据库的密码]" -S "[SQLMI的DNS地址]"

  比如我们执行下面的脚本,把testcsv.fmt文件保存到本地的D盘,如下图

bcp [dbname].[schema].[tablename] format nul -c -f D:\testcsv.fmt -t,  -U "[登录数据库的用户名]" -P "[登录数据库的密码]" -S "[SQLMI的DNS地址]"

  执行完毕后,我们用记事本打开D盘的testcsv.fmt文件,如下图:

  这个format文件我们需要保留下来,后续可以在csv文件schema不变的情况下可以继续使用

  

 

 

  第四步:将CSV文件和Format上传到Azure Blob,并通过T-SQL语句导入

  1.我们把上面步骤中用到的testcsv.csv文件和testcsv.fmt文件,都上传到Azure Blob存储账户里,保存在container 名称为factory01

  注意需要把container属性设置为private,不允许匿名访问

  上传完毕后,全路径为:

  https://leisqlmi01storage.blob.core.chinacloudapi.cn/factory01/factory01.csv

  https://leisqlmi01storage.blob.core.chinacloudapi.cn/factory01/factory01.fmt

 

  2.点击Azure Blob存储账户,点击Container,点击Generate SAS Token and URL,然后复制SAS Token

  

 

 

  

  3.我们回到SQL Server Management Studio,打开需要访问的数据库,右键New Query,执行下面的脚本:

--下面的password的秘钥内容,可以根据需要修改PASSWORD值
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '12345#KL95234nl0zBe';  

CREATE DATABASE SCOPED CREDENTIAL factory01
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '[这里是你在上面步骤复制的SAS Token]';


--设置设置External Data Source
CREATE EXTERNAL DATA SOURCE factory01Container
    WITH (
        TYPE = BLOB_STORAGE,
        LOCATION = 'https://leisqlmi01storage.blob.core.chinacloudapi.cn/factory01',
        CREDENTIAL = factory01
    );

--BULK 就是需要导入的CSV文件,已经保存到Azure Blob中
--Formatfile就是BCP命令导出的format文件
  SELECT * FROM OPENROWSET(
   BULK 'testcsv.csv',
   DATA_SOURCE = 'factory01Container',
   FORMAT = 'CSV',
   FORMATFILE='testcsv.fmt',
   FORMATFILE_DATA_SOURCE = 'factory01Container'
   ) AS DataFile;

 

  这样就可以通过OPENROWSET,访问保存到Azure Blob中的CSV文件

 

  

标签:文件,Managed,MI,Instance,导入,SQL,Azure,CSV
From: https://www.cnblogs.com/threestone/p/16785705.html

相关文章

  • Native SQL 整理
    目录1一、静态调用连接数据库创建数据库更新数据库数据查询-到字段查询-到结构:(结构跟搜索字段完全对应)查询-到内表删除数据库数据...9删除数据库...9二、动......
  • MySQL 8.0.31 发布
    MySQL8.0.31在昨天(2022-10-11)正式发布,这一篇文章来一起看看有哪些更改。审计插件:审计插件的日志轮换函数audit_log_rotate(),简化了日志轮换的工作,用户无需手动更改日志名......
  • mysql存储json
    mysql存储json  1.json_merge合并Json并返回 ?1update`user`setinviteeMap=json_merge(inviteeMap,'{"xx1":100}')    where`account`='100089'......
  • 关于 sql 中的 over() 函数
    关于sql中的row_number()、over()、rank()、dense_rank()函数,还是挺常见的,而且看起来高级。萌新理解另一种聚合函数,不需要绑定groupby就能把聚合和非聚合的函数展示......
  • mysql数据库新增用户只有读写权限
    CREATEUSER'pcms'@'%'IDENTIFIEDBY'123456';  --创建用户pcms,密码为123456GRANTSELECT,INSERT,UPDATE,DELETEONdatabase1.*TO'pcms';--赋予pcms账号,datab......
  • mysql if判断字符串比较
    一、ifnull判断selectifnull(param,1);#如果param为null则输出1,如果不为null,则输出param当使用concat拼接时,如果有列值为null,结果从null到最后都是一个null填充,不会再显示......
  • sql server 解密存储过程的过程
    UsemasterGoifobject_ID('[sp_DecryptObject]')isnotnullDropProcedure[sp_DecryptObject]Gocreateproceduresp_DecryptObject(@Objectsysname,......
  • mysql模糊查时间
     今天需要用到模糊查时间,直接模糊查时间一直报错,后来查阅网上一些资料知道date_format()可以根据指定格式来格式化日期值,并返回格式化的日期字符串,下面的内容都是从大佬......
  • SqlServer 2008R2数据库日志损坏后数据库恢复
    详细的恢复方法:1、停止数据库服务。2、将需要恢复的数据库文件复制到另外的位置。3、启动数据库服务。4、确认要恢复的数据库文件已经成功复制到另外的位置,然后在SQLS......
  • mysql换行符查询
    mysql:select*from tb_prowhere tb_pro.namelikeCONCAT('%',char(10),'%')select*from tb_prowhere tb_pro.namelikeCONCAT('%',char(13),'%')    ......