Hızlı Başlangıç: COPY deyimini kullanarak verileri toplu yükleme

Bu hızlı başlangıçta, yüksek aktarım hızına yönelik veri alımı için basit ve esnek COPY deyimini kullanarak verileri ayrılmış SQL havuzunuza toplu olarak yükleyeceksiniz. COPY deyimi, aşağıdaki işlevleri sağlayarak verileri sorunsuz ve esnek bir şekilde yüklemenize olanak sağladığından önerilen yükleme yardımcı programıdır:

  • Veri ambarı üzerinde katı CONTROL izinlerine gerek kalmadan daha düşük ayrıcalıklı kullanıcıların yüklenmesine izin ver
  • Ek veritabanı nesnesi oluşturmak zorunda kalmadan yalnızca tek bir T-SQL deyiminden yararlanın
  • Paylaşım Erişim İmzalarını (SAS) kullanarak depolama hesabı anahtarlarını kullanıma sunmadan daha ince bir izin modelinden yararlanın
  • ERRORFILE konumu için farklı bir depolama hesabı belirtin (REJECTED_ROW_LOCATION)
  • Her hedef sütun için varsayılan değerleri özelleştirin ve kaynak veri alanlarını belirli hedef sütunlara yükleneceğini belirtin
  • CSV dosyaları için özel satır sonlandırıcı belirtme
  • CSV dosyaları için kaçış dizesi, alan ve satır sınırlayıcıları
  • CSV dosyaları için SQL Server Tarih biçimlerini kullanma
  • Depolama konumu yolunda joker karakterler ve birden çok dosya belirtme

Önkoşullar

Bu hızlı başlangıçta zaten ayrılmış bir SQL havuzunuz olduğu varsayılır. Ayrılmış bir SQL havuzu oluşturulmadıysa Oluşturma ve Bağlanma - portal hızlı başlangıcını kullanın.

Gerekli izinleri ayarlama

-- 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>

Hedef tabloyu oluşturma

Bu örnekte New York taksi veri kümesinden veri yükleyeceğiz. Tek bir yıl içinde yapılan taksi yolculuklarını temsil eden Trip adlı bir tablo yükleyeceğiz. Tabloyu oluşturmak için aşağıdakileri çalıştırın:

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 deyimini çalıştırma

Azure blob depolama hesabından Trip tablosuna veri yükleyecek aşağıdaki COPY deyimini çalıştırın.

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

Yükü izleme

Aşağıdaki sorguyu düzenli aralıklarla çalıştırarak yükünüzün ilerleme kaydedip ilerlemediğini denetleyin:

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;

Sonraki adımlar