将数据从 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
長按二維碼獲取我的最新技術分享
喜歡本篇內容請點個在看
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的将数据从 SQL Server 导入 Azure Storage Table的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 反射获取所有控制器及
- 下一篇: Telegraf和Grafana监控多平