将数据从 SQL Server 导入 Azure Storage Table

点击上方蓝字关注“汪宇杰博客”

导语

最近有个需求要将数据存储从 SQL Server 数据库切换到 Azure Storage 中的 Table。然而不管是 SSMS 还是 Azure Portal 都没有提供直接的导入功能,是不是又想自己写程序去导数据了?其实不用!没有点过数据库天赋的我996了一个晚上,终于找到了点点鼠标就搞定的方法,今天分享给大家。

但首先要告诫大家的是,SQL Server 这样的关系型数据库和 Azure 提供的 NoSQL 服务概念不一样。在进行操作之前,请研究并确保自己的业务真的适合 Storage Table (或 Cosmos Table),以免适得其反。

准备工作

你当然需要一个 Azure Storage Account,在其中建立空表,用于导入数据,例如:LinkTracking

下载安装 Microsoft Azure Storage Explorer

https://azure.microsoft.com/en-us/features/storage-explorer/

下载安装 SQL Server Management Studio (仅 Windows) 或 Azure Data Studio (跨平台)

https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver15

导出数据

我们需要将 SQL Server 表中的数据导出为 CSV 格式,以便导入 Azure Storage Table。但要对数据做一些处理,不然就会爆,然后996。

以单表数据导出为例,Azure Storage Table 需要两个必要字段:PartitionKey, RowKey。而 SQL Server 的表往往用一列或多列作为主键,并且没有固定的名称约束。因此,我们首先要处理的就是主键。

我的 LinkTracking 表使用 GUID 类型的 Id 作为主键,将其转换为 RowKey。至于 PartitionKey,原始表中不存在,我们可以自己创造一个固定的字符串即可,比如 'LT996'。

通过简单的 SELECT 语句就可以把 PartitionKey, RowKey 搞定:

SELECT

    'LT996' AS PartitionKey,

    lt.Id AS RowKey

    -- 省略其他列

FROM LinkTracking lt

接着还有个福报要修,即 DateTime 类型的数据需要转换为 ISO 8601 标准格式,不然导入数据的时候就会爆,并且只告诉你爆了,不告诉你原因,导致996。

ISO 8601时间日期格式可参考:https://en.wikipedia.org/wiki/ISO_8601

T-SQL 中转换 ISO 8601 也很简单:

CONVERT(char(30), DateTime数据,126) 

现在,最终的 SQL 语句为:

SELECT

    'LT996' AS PartitionKey,

    lt.Id AS RowKey,

    lt.LinkId, lt.UserAgent, lt.IpAddress,

    CONVERT(char(30), lt.RequestTimeUtc,126) AS RequestTimeUtc

FROM LinkTracking lt

接下来我们就得把查询结果导出到CSV文件了,不想996的话,有三种办法:

小数据量,轻量级工具

如果你表中的数据量不多,可以选用 Azure Data Studio 这款跨平台工具完成导出操作,用不着装笨重的、启动巨慢的SSMS。

在 Azure Data Studio 中执行 SQL 语句后,点击结果集网格右边的工具栏中的导出为 CSV 按钮,即可将结果保存为 含有列名的 CSV 文件。

但是这种方法有缺点。首先是结果网格有数据量限制,不仅限制条数,也限制列里显的字符数量,遇到企业场景大量数据肯定要爆。于是就有了下面的两种办法。

常规数据量,用工具,而不是玩具

经典老牌的 SSMS 提供了专门的数据导出向导,支持 CSV 格式。其中也有两种导出方式。

从 SQL 语句导出

我们仍就可以利用刚才写的 SQL 导出数据,但这次不再从结果网格中导出(尽管SSMS支持这么做,但也面临同样的数据量限制)。

在数据库上点右键,选择 Tasks - Export Data

在向导里将数据源选为 SQL Server Native Client,并连接自己的数据库。

然后把 Destination 选为 Flat File Destination,并指定一个 CSV 路径作为目标。

然后选择 Write a query to specify the data to transfer

输入刚才的 SQL 语句

确定空格编码符合Windows规则,及分隔符为逗号

Next到底,完成导出

从 View 导出

另一种方法是建一个View,仍然用相同的SQL语句,好处是方便重用。

View 的数据导出方法与刚才几乎一致,唯一的区别是在 “Specify Table Copy or Query”中选择"Copy data from one or more tables or views"。

导入数据

启动 Azure Storage Explorer,打开 Azure Storage 中要导入数据的目标表,在工具栏上点击 Import

选择刚才导出的 CSV 文件,核对并更改数据类型。在我的例子里,我仅需要更改 RequestTimeUtc 为 DateTime 类型。

点击 Insert 后,稍等片刻,数据就被成功导入了!

你也可以回到 Azure Portal 看到这些数据

更多关于 Azure Storage Table,可参考 https://docs.microsoft.com/en-us/azure/storage/tables/table-storage-overview

汪宇杰博客

.NET | Azure | 微软MVP

长按二维码获取我的最新技术分享

喜欢本篇内容请点个在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JavaWeb-HTTP]HTTP概念

HTTP: * 概念:Hyper Text Transfer Protocol 超文本传输协议* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式* 特点:1. 基于TCP/IP的高级协议2. 默认端口号:803. 基于请求/响应模型的:一次请求对…

【完整目录】每天5分钟用C#学习数据结构

【基础知识】| 作者 / Edison Zhou这是恰童鞋骚年的第250篇原创内容不知不觉,每天5分钟学习数据结构就更新完了,本篇将该系列所有文章整理起来作为一个目录,方便你的快速阅读。1线性表线性表是最简单也是在编程当中使用最多的一种数据结构。例…

.NET 5 开发WPF - 美食应用登录UI设计

点击上方“Dotnet9”添加关注哦Demo演示:演示动画你的时间宝贵,不想看啰嗦的文字,可直接拉到文末下载源码!1. 新建项目站长开发环境:VS 2019企业版 16.70.NET 5 Preview 5.NET 5 WPF 项目模板和 .NET Core 3.1 WPF 项目…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)

系列文章使用 abp cli 搭建项目给项目瘦身,让它跑起来完善与美化,Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API,包装返回模型再说Swagger,分组、描述、小绿锁接入GitHub,用JWT保护你的API异常处理和…

C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法

一:背景1. 讲故事上一篇C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家…

软件设计模式期末大作业——可乐商城管理系统

文章目录设计模式大作业软 件 设 计 模 式 任 务 书设计要求:学生应完成的工作:1. 应用场景描述2. 设计模式选择3. 实现语言与工具参考文献阅读:工作计划:一、系统目标1. 设计目的2. 需求描述二、 系统模式选择1.需求分析2.选用设…

深度解读Microsoft Build 2020:提升开发效率,优化开发环境

Microsoft Build 2020在众多新产品与技术发布中圆满落幕但身为开发技术人深知技术世界的更迭、求索却从未止步唯有不断提升自身技能栈创新方能从技术浮沉中获得更多养分让技术予力世界更有温度Microsoft Build 2020大会后, Visual Studio Family 和 .NET 成为众多开…

[JavaWeb]web相关概念回顾

web相关概念回顾 1. 软件架构1. C/S:客户端/服务器端2. B/S:浏览器/服务器端2. 资源分类1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析* 如: html,css,Jav…

Github 数据洞察之复杂信息网络

摘要:开源协作是数字化时代的必备技能,而背后的开发行为分析,能够让你看到一幅开源世界的全景图;2020年2月,X-lab 开放实验室联合InfoQ发布了《GitHub 2019 数字年报》,收到了业界的一致好评。数据科学与工…

2020年,.NET Core起飞在即,最强日志分析ELK还不会?

近期.NET社区迎来一系列利好:1 Build2020,微软发布多款产品赋能.NET开发者,比以往任何时候都更贴近开发者;2 TechEmpower第19轮编程语言框架性能排行榜,Asp.Net Core成为主流Web框架第一;3 Stackoverflow 2…

[JavaWeb-HTTP]request对象和response对象的原理

request对象和response对象的原理 1. request和response对象是由服务器创建的。我们来使用它们2. request对象是来获取请求消息,response对象是来设置响应消息

时间序列神器之争:prophet VS lstm

一、需求背景我们福禄网络致力于为广大用户提供智能化充值服务,包括各类通信充值卡(比如移动、联通、电信的话费及流量充值)、游戏类充值卡(比如王者荣耀、吃鸡类点券、AppleStore充值、Q币、斗鱼币等)、生活服务类&am…

docker registry 镜像同步

docker registry 镜像同步Intro之前我们的 docker 镜像是保存在 Azure 的 Container Registry 里的,最近我们自己搭建了一个 docker registry,我们想把之前保存的 Azure 的 Container Registry 的 docker 镜像同步到我们自己的 docker registry 里实现思…

[数据结构-严蔚敏版]P37定义一个带头结点的线性链表

大家如果发现代码有错误&#xff0c;麻烦评论告知一下!!! 代码我已经发现存在部分错误&#xff0c;等有时间我再进行修正。目前存在错误:mergeList_L函数有问题! 代码如下: #include <iostream> using namespace std;typedef struct LNode {int data;LNode *next; }*L…

.NET Core加解密实战系列之——RSA非对称加密算法

简介加解密现状&#xff0c;编写此项目的背景&#xff1a;需要考虑系统环境兼容性问题&#xff08;Linux、Windows&#xff09;语言互通问题&#xff08;如C#、Java&#xff09;网上资料版本不一、不全面.NET官方库密码算法提供不全面&#xff0c;很难针对其他语言&#xff08;…

[数据结构-严蔚敏版]P42多项式Polynomial的实现

大家如果发现代码有错误&#xff0c;麻烦评论告知一下!!! 下面的代码多项式相乘的算法实现并不是书上那种&#xff0c;书上那种我实在是看不懂&#xff0c;所以用了自己的方法写了相乘的算法&#xff0c;就是模拟手算过程&#xff0c;一个一个相乘。 代码如下: #include <…

number five

一、外单履行域业务熟悉 申请了各种权限 看了部分三号项目 熟悉测试流程&#xff0c;例如履行的一些工具&#xff0c;只是熟悉了平台&#xff0c;因为部分权限未申请&#xff0c;没有操作过测试。 对于三号项目概念还没成体系&#xff0c;但了解了相关测试任务。 中间件hsf…

.Net Core实战之基于角色的访问控制的设计

前言上个月&#xff0c;我写了两篇微服务的文章&#xff1a;《.Net微服务实战之技术架构分层篇》与《.Net微服务实战之技术选型篇》&#xff0c;微服务系列原有三篇&#xff0c;当我憋第三篇的内容时候一直没有灵感&#xff0c;因此先打算放一放。本篇文章与源码原本打算实在去…

[数据结构-严蔚敏版]P46栈的顺序存储表示

大家如果发现代码有错误&#xff0c;麻烦评论告知一下!!! 代码如下: #include <iostream> using namespace std;const int STACK_INIT_SIZE 100; const int STACKINCREMENT 10;typedef int ElemType;typedef struct {ElemType *base;ElemType *top;int stacksize; }S…

ProcessOn使用

文章目录1. 拥有一个账号;2.思维导图&#xff1a;快速添加主题&#xff1a;移动主题位置和排序用格式刷来复制主题样式善用右键菜单快捷键后续使用时再补充 ^ ^1. 拥有一个账号; 2.思维导图&#xff1a; 快速添加主题&#xff1a; 移动主题位置和排序 用格式刷来复制主题样式…