将数据从 SQL Server 导入 Azure Storage Table
點擊上方藍字關注“汪宇杰博客”
導語
最近有個需求要將數(shù)據(jù)存儲從 SQL Server 數(shù)據(jù)庫切換到 Azure Storage 中的 Table。然而不管是 SSMS 還是 Azure Portal 都沒有提供直接的導入功能,是不是又想自己寫程序去導數(shù)據(jù)了?其實不用!沒有點過數(shù)據(jù)庫天賦的我996了一個晚上,終于找到了點點鼠標就搞定的方法,今天分享給大家。
但首先要告誡大家的是,SQL Server 這樣的關系型數(shù)據(jù)庫和 Azure 提供的 NoSQL 服務概念不一樣。在進行操作之前,請研究并確保自己的業(yè)務真的適合 Storage Table (或 Cosmos Table),以免適得其反。
準備工作
你當然需要一個 Azure Storage Account,在其中建立空表,用于導入數(shù)據(jù),例如: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
導出數(shù)據(jù)
我們需要將 SQL Server 表中的數(shù)據(jù)導出為 CSV 格式,以便導入 Azure Storage Table。但要對數(shù)據(jù)做一些處理,不然就會爆,然后996。
以單表數(shù)據(jù)導出為例,Azure Storage Table 需要兩個必要字段:PartitionKey, RowKey。而 SQL Server 的表往往用一列或多列作為主鍵,并且沒有固定的名稱約束。因此,我們首先要處理的就是主鍵。
我的 LinkTracking 表使用 GUID 類型的 Id 作為主鍵,將其轉(zhuǎn)換為 RowKey。至于 PartitionKey,原始表中不存在,我們可以自己創(chuàng)造一個固定的字符串即可,比如 'LT996'。
通過簡單的 SELECT 語句就可以把 PartitionKey, RowKey 搞定:
SELECT
??? 'LT996' AS PartitionKey,
??? lt.Id AS RowKey
? ? -- 省略其他列
FROM LinkTracking lt
接著還有個福報要修,即 DateTime 類型的數(shù)據(jù)需要轉(zhuǎn)換為 ISO 8601 標準格式,不然導入數(shù)據(jù)的時候就會爆,并且只告訴你爆了,不告訴你原因,導致996。
ISO 8601時間日期格式可參考:https://en.wikipedia.org/wiki/ISO_8601
T-SQL 中轉(zhuǎn)換 ISO 8601 也很簡單:
CONVERT(char(30), DateTime數(shù)據(jù),126)?
現(xiàn)在,最終的 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
接下來我們就得把查詢結(jié)果導出到CSV文件了,不想996的話,有三種辦法:
小數(shù)據(jù)量,輕量級工具
如果你表中的數(shù)據(jù)量不多,可以選用 Azure Data Studio 這款跨平臺工具完成導出操作,用不著裝笨重的、啟動巨慢的SSMS。
在 Azure Data Studio 中執(zhí)行 SQL 語句后,點擊結(jié)果集網(wǎng)格右邊的工具欄中的導出為 CSV 按鈕,即可將結(jié)果保存為 含有列名的 CSV 文件。
但是這種方法有缺點。首先是結(jié)果網(wǎng)格有數(shù)據(jù)量限制,不僅限制條數(shù),也限制列里顯的字符數(shù)量,遇到企業(yè)場景大量數(shù)據(jù)肯定要爆。于是就有了下面的兩種辦法。
常規(guī)數(shù)據(jù)量,用工具,而不是玩具
經(jīng)典老牌的 SSMS 提供了專門的數(shù)據(jù)導出向?qū)?#xff0c;支持 CSV 格式。其中也有兩種導出方式。
從 SQL 語句導出
我們?nèi)跃涂梢岳脛偛艑懙?SQL 導出數(shù)據(jù),但這次不再從結(jié)果網(wǎng)格中導出(盡管SSMS支持這么做,但也面臨同樣的數(shù)據(jù)量限制)。
在數(shù)據(jù)庫上點右鍵,選擇 Tasks - Export Data
在向?qū)Ю飳?shù)據(jù)源選為 SQL Server Native Client,并連接自己的數(shù)據(jù)庫。
然后把 Destination 選為 Flat File Destination,并指定一個 CSV 路徑作為目標。
然后選擇 Write a query to specify the data to transfer
輸入剛才的 SQL 語句
確定空格編碼符合Windows規(guī)則,及分隔符為逗號
Next到底,完成導出
從 View 導出
另一種方法是建一個View,仍然用相同的SQL語句,好處是方便重用。
View 的數(shù)據(jù)導出方法與剛才幾乎一致,唯一的區(qū)別是在 “Specify Table Copy or Query”中選擇"Copy data from one or more tables or views"。
導入數(shù)據(jù)
啟動 Azure Storage Explorer,打開?Azure Storage 中要導入數(shù)據(jù)的目標表,在工具欄上點擊 Import
選擇剛才導出的 CSV 文件,核對并更改數(shù)據(jù)類型。在我的例子里,我僅需要更改 RequestTimeUtc 為 DateTime 類型。
點擊 Insert 后,稍等片刻,數(shù)據(jù)就被成功導入了!
你也可以回到 Azure Portal 看到這些數(shù)據(jù)
更多關于 Azure Storage Table,可參考?https://docs.microsoft.com/en-us/azure/storage/tables/table-storage-overview
汪宇杰博客
.NET | Azure |?微軟MVP
長按二維碼獲取我的最新技術分享
喜歡本篇內(nèi)容請點個在看
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的将数据从 SQL Server 导入 Azure Storage Table的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 反射获取所有控制器及
- 下一篇: Telegraf和Grafana监控多平