練習 - 將資料載入 Azure SQL Database 中
當您要大量載入資料時,資料必須來自於某處。 在 Azure 中,通常會將資料儲存或傾印到Azure Blob 儲存體。 Blob 儲存體已針對以相對較低的成本儲存大量非結構化資料進行最佳化。
在此案例中,Adventure Works Cycles 會依據存放區識別碼接收存放區傳回資料。 此資料會儲存於 .dat 檔案中,然後再推送到 Azure Blob 儲存體中。 資料位於 Blob 儲存體中之後,Azure SQL 會需要其存取方法。 為此,您可建立可存取儲存體帳戶的外部資料來源。 您可以透過 Microsoft Entra ID、共用金鑰授權或共用存取簽章 (SAS) 來控制對該儲存體帳戶的存取。
在本練習中,我們會探索將資料從 Azure Blob 儲存體大量載入 Azure SQL Database 的案例。 此方法會使用 T-SQL 和共用存取簽章。
有兩個選項可完成此練習:
- Azure Cloud Shell 中的
sqlcmd
- Azure Data Studio 中的 SQL 筆記本
這兩個練習包含相同的命令與內容,所以您可選擇偏好的選項。
選項 1:在 Azure Cloud Shell 中使用 sqlcmd
sqlcmd
是命令列工具,其可供使用命令列與 SQL Server 和 Azure SQL 進行互動。 在本練習中,您會在 Azure Cloud Shell 的 PowerShell 執行個體中使用 sqlcmd
。 由於根據預設會安裝 sqlcmd
,因此很容易從 Azure Cloud Shell 加以使用。
基於針對 Bash 設定 Azure Cloud Shell 的方式,您必須先在 Azure Cloud Shell 中執行下列命令,以變更終端模式。
TERM=dumb
修改您的伺服器名稱和密碼之後,請在整合式終端機中執行下列命令。
sqlcmd -S <server name>.database.windows.net -P <password> -U cloudadmin -d AdventureWorks
為要載入的資料建立資料表和結構描述。 此流程為直接的 T-SQL。 在終端中執行下列指令碼後,即會連線至資料庫:
IF SCHEMA_ID('DataLoad') IS NULL EXEC ('CREATE SCHEMA DataLoad') CREATE TABLE DataLoad.store_returns ( sr_returned_date_sk bigint, sr_return_time_sk bigint, sr_item_sk bigint, sr_customer_sk bigint, sr_cdemo_sk bigint, sr_hdemo_sk bigint, sr_addr_sk bigint, sr_store_sk bigint, sr_reason_sk bigint, sr_ticket_number bigint, sr_return_quantity integer, sr_return_amt float, sr_return_tax float, sr_return_amt_inc_tax float, sr_fee float, sr_return_ship_cost float, sr_refunded_cash float, sr_reversed_charge float, sr_store_credit float, sr_net_loss float ); GO
提示
您會在 T-SQL 陳述式之後看到數字項目。 它代表 T-SQL 項目的每一行。 例如,上述命令的結尾是
26
。 請務必選取這幾行之後的 ENTER。當再次看到
1>
時,您便會知道命令已完成 (其表示已可在下一個 T-SQL 項目的第一行中輸入sqlcmd
)。接下來,請建立主要金鑰:
CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyComplexPassword00!'; GO
必須要有主要金鑰才能建立
DATABASE SCOPED CREDENTIAL
值,因為 Blob 儲存體並未設為允許公開 (匿名) 存取。 認證是指 Blob 儲存體帳戶。 資料部分會指定存放區傳回資料的容器。使用共用存取簽章作為 Azure SQL 了解如何解讀的身分識別。 祕密是可從 Blob 儲存體帳戶產生的 SAS 權杖。 在此範例中,系統會提供無法存取儲存體帳戶的 SAS 權杖,因此只能存取存放區傳回資料。
CREATE DATABASE SCOPED CREDENTIAL [https://azuresqlworkshopsa.blob.core.windows.net/data/] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'st=2020-09-28T22%3A05%3A27Z&se=2030-09-29T22%3A05%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=52WbuSIJCWyjS6IW6W0ILfIpqh4wLMXmOlifPyOetZI%3D'; GO
建立容器的外部資料來源:
CREATE EXTERNAL DATA SOURCE dataset WITH ( TYPE = BLOB_STORAGE, LOCATION = 'https://azuresqlworkshopsa.blob.core.windows.net/data', CREDENTIAL = [https://azuresqlworkshopsa.blob.core.windows.net/data/] ); GO
大量插入其中一個存放區傳回檔案。 執行下列指令碼,並在執行完成後檢閱註解:
SET NOCOUNT ON -- Reduce network traffic by stopping the message that shows the number of rows affected BULK INSERT DataLoad.store_returns -- Table you created in step 3 FROM 'dataset/store_returns/store_returns_1.dat' -- Within the container, the location of the file WITH ( DATA_SOURCE = 'dataset' -- Using the external data source from step 6 ,DATAFILETYPE = 'char' ,FIELDTERMINATOR = '\|' ,ROWTERMINATOR = '\|\n' ,BATCHSIZE=100000 -- Reduce network traffic by inserting in batches , TABLOCK -- Minimize number of log records for the insert operation ); GO
您可查看已插入資料表中的資料列數目:
SELECT COUNT(*) FROM DataLoad.store_returns; GO
如果一切都正常運作,您應該會看到
2807797
傳回。
此程式碼是簡單的範例,了解如何將資料從 Blob 儲存體插入 Azure SQL Database。 如果想要再次執行練習,請執行下列程式碼以重設您已完成的作業:
DROP EXTERNAL DATA SOURCE dataset;
DROP DATABASE SCOPED CREDENTIAL [https://azuresqlworkshopsa.blob.core.windows.net/data/];
DROP TABLE DataLoad.store_returns;
DROP MASTER KEY;
GO
選項 2:Azure Data Studio 中的 SQL 筆記本
針對此活動,請使用名為 LoadData.ipynb 的筆記本。 您可以在裝置上的 \mslearn-azure-sql-fundamentals\02-DeployAndConfigure\loaddata 中找到它。 請在 Azure Data Studio 中開啟這個檔案以完成本練習,然後返回此處。
若因故無法完成練習,您可在 GitHub 上對應的筆記本檔案中檢閱結果。