导语
最近有个需求要将数据存储从 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