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

导语
最近有个需求要将数据存储从 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
长按二维码获取我的最新技术分享
喜欢本篇内容请点个在看





