快速入門:使用 COPY 陳述式大量載入資料

在本快速入門中,您會使用簡單且彈性的 COPY 陳述式,將資料大量載入至專屬的 SQL 集區,以進行高輸送量的資料內嵌。 COPY 陳述式是建議的載入公用程式,因為其可讓您透過提供下列功能,順暢且靈活地載入資料:

  • 允許較低權限的使用者載入,無需對資料倉儲設定嚴格的控制權限
  • 只利用單一 T-SQL 陳述式,無需建立任何額外的資料庫物件
  • 在不使用共用存取簽章 (SAS) 公開儲存體帳戶金鑰的情況下,利用更精細的權限模型
  • 為 ERRORFILE 位置 (REJECTED_ROW_LOCATION) 指定不同的儲存體帳戶
  • 自訂每個目標資料行的預設值,並指定要載入特定目標資料行的來源資料欄位
  • 指定 CSV 檔案的自訂資料列結束字元
  • 為 CSV 檔案逸出字串、欄位和資料列分隔符號
  • 利用 CSV 檔案的 SQL Server 日期格式
  • 在儲存體位置路徑中指定萬用字元和多個檔案

必要條件

本快速入門假設您已有專屬的 SQL 集區。 如果尚未建立專屬的 SQL 集區,請使用建立和連線 - 入口網站快速入門。

設定必要權限

-- List the permissions for your user
select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
where name = '<yourusername>';

--Make sure your user has the permissions to CREATE tables in the [dbo] schema
GRANT CREATE TABLE TO <yourusername>;
GRANT ALTER ON SCHEMA::dbo TO <yourusername>;

--Make sure your user has ADMINISTER DATABASE BULK OPERATIONS permissions
GRANT ADMINISTER DATABASE BULK OPERATIONS TO <yourusername>

--Make sure your user has INSERT permissions on the target table
GRANT INSERT ON <yourtable> TO <yourusername>

建立目標資料表

在此範例中,我們將從紐約計程車資料集載入資料。 我們會載入稱為「行程」的資料表,代表計程車在一年內所進行的行程。 執行下列項目以建立資料表:

CREATE TABLE [dbo].[Trip]
(
    [DateID] int NOT NULL,
    [MedallionID] int NOT NULL,
    [HackneyLicenseID] int NOT NULL,
    [PickupTimeID] int NOT NULL,
    [DropoffTimeID] int NOT NULL,
    [PickupGeographyID] int NULL,
    [DropoffGeographyID] int NULL,
    [PickupLatitude] float NULL,
    [PickupLongitude] float NULL,
    [PickupLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [DropoffLatitude] float NULL,
    [DropoffLongitude] float NULL,
    [DropoffLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [PassengerCount] int NULL,
    [TripDurationSeconds] int NULL,
    [TripDistanceMiles] float NULL,
    [PaymentType] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [FareAmount] money NULL,
    [SurchargeAmount] money NULL,
    [TaxAmount] money NULL,
    [TipAmount] money NULL,
    [TollsAmount] money NULL,
    [TotalAmount] money NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

執行 COPY 陳述式

執行下列 COPY 陳述式,將資料從 Azure Blob 儲存體帳戶載入至「行程」資料表。

COPY INTO [dbo].[Trip] FROM 'https://nytaxiblob.blob.core.windows.net/2013/Trip2013/'
WITH (
   FIELDTERMINATOR='|',
   ROWTERMINATOR='0x0A'
) OPTION (LABEL = 'COPY: dbo.trip');

監視載入

定期執行下列查詢,以檢查您的載入是否正在進行中:

SELECT  r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command
,       sum(bytes_processed) AS bytes_processed
,       sum(rows_processed) AS rows_processed
FROM    sys.dm_pdw_exec_requests r
              JOIN sys.dm_pdw_dms_workers w
                     ON r.[request_id] = w.request_id
WHERE [label] = 'COPY: dbo.trip' and session_id <> session_id() and type = 'WRITER'
GROUP BY r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command;

後續步驟