Verileri SQL Server'a aktarmak için BULK INSERT veya OPENROWSET(BULK...) kullanın

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu makalede, Transact-SQL BULK INSERT deyimini ve INSERT...SELECT * FROM OPENROWSET(BULK...) deyimini kullanarak verileri bir veri dosyasından SQL Server veya Azure SQL Veritabanı tablosuna toplu olarak içeri aktarmaya yönelik genel bir bakış sağlanır.

Bu makalede, BULK INSERT ve OPENROWSET(BULK...) kullanımı ile uzak bir veri kaynağından toplu içeri aktarma için bu yöntemlerin güvenlik konuları da açıklanmaktadır.

BULK INSERT açıklama

BULK INSERT bir veri dosyasındaki verileri tabloya yükler. Bu işlevsellik, in komutunun bcp seçeneği tarafından sağlanan işleve benzer. Ancak, veri dosyası SQL Server işlemi tarafından okunur. Söz diziminin BULK INSERT açıklaması için bkz BULK INSERT . (Transact-SQL).

BULK INSERT örnekleri

OPENROWSET(BULK...) Fonksiyonu

Toplu OPENROWSET satır kümesi sağlayıcısına OPENROWSET işlevi çağrılarak ve BULK seçeneği belirtilerek erişilir. işlevi, OPENROWSET(BULK...) bir veri sağlayıcısı aracılığıyla veri dosyası gibi uzak bir veri kaynağına bağlanarak uzak verilere erişmenizi sağlar.

Verileri toplu aktarmak için, bir OPENROWSET(BULK...) deyimi içindeki SELECT...FROM yan tümcesinden INSERT çağrısı yapın.

Verileri toplu içeri aktarmaya yönelik temel söz dizimi şöyledir:

INSERT ... SELECT * FROM OPENROWSET(BULK...)

Bir INSERT deyimde kullanıldığında tablo OPENROWSET(BULK...) ipuçlarını destekler. gibi normal tablo ipuçlarına ek olarakTABLOCKBULK, yan tümcesi aşağıdaki özel tablo ipuçlarını kabul edebilir:

  • IGNORE_CONSTRAINTS (yalnızca CHECK kısıtlamalarını yoksayar)
  • IGNORE_TRIGGERS
  • KEEPDEFAULTS
  • KEEPIDENTITY

Daha fazla bilgi için bkz. Tablo ipuçları (Transact-SQL).

BULK seçeneğinin ek kullanımları hakkında bilgi için bkz. OPENROWSET BULK (Transact-SQL).

INSERT...SELECT * FROM OPENROWSET(BULK...) ifadeleri - örnekler

Güvenlikle ilgili dikkat edilmesi gerekenler

Bir kullanıcı SQL Server oturum açma bilgileri kullanıyorsa, SQL Server işlem hesabının güvenlik profili kullanılır. SQL Server kimlik doğrulaması kullanılarak oturum açma bilgilerinin kimliği Veritabanı Altyapısı dışında doğrulanamaz. Bu nedenle, SQL Server kimlik doğrulaması kullanılarak bir BULK INSERT komut oturum açma işlemiyle başlatıldığında, veri bağlantısı SQL Server işlem hesabının (SQL Server Veritabanı Altyapısı hizmeti tarafından kullanılan hesap) güvenlik bağlamı kullanılarak yapılır.

Kaynak verileri başarıyla okumak için SQL Server Veritabanı Altyapısı tarafından kullanılan hesaba kaynak verilere erişim vermelisiniz. Buna karşılık, bir SQL Server kullanıcısı Windows Kimlik Doğrulaması kullanarak oturum açarsa, kullanıcı SQL Server işleminin güvenlik profilinden bağımsız olarak yalnızca kullanıcı hesabı tarafından erişilebilen dosyaları okuyabilir.

Örneğin, Windows Kimlik Doğrulaması kullanarak SQL Server örneğinde oturum açan bir kullanıcıyı düşünün. Kullanıcının, bir veri dosyasındaki verileri SQL Server tablosuna içeri aktarmak için BULK INSERT veya OPENROWSET kullanabilmesi için, kullanıcı hesabının veri dosyasına okuma erişimi olması gerekir. Veri dosyasına erişim sayesinde, SQL Server işleminin dosyaya erişim izni olmasa bile kullanıcı dosyadaki verileri bir tabloya aktarabilir. Kullanıcının SQL Server işlemine dosya erişimi izni vermesi gerekmez.

SQL Server ve Microsoft Windows, kimliği doğrulanmış bir Windows kullanıcısının kimlik bilgilerini ileterek SQL Server örneğinin başka bir SQL Server örneğine bağlanmasını sağlayacak şekilde yapılandırılabilir. Bu düzenleme kimliğe bürünme veya temsilci seçme olarak bilinir. BULK INSERT veya OPENROWSET kullandığınızda, SQL Server sürümünün kullanıcı kimliğine bürünmede güvenliği nasıl ele aldığını anlamak önemlidir. Kullanıcı kimliğine bürünme, veri dosyasının SQL Server işleminden veya kullanıcıdan farklı bir bilgisayarda bulunmasına olanak tanır. Örneğin, Computer_A üzerindeki bir kullanıcının Computer_B üzerindeki bir veri dosyasına erişimi varsa ve kimlik bilgileri temsilcisi uygun şekilde ayarlandıysa, kullanıcı Computer_C üzerinde çalışan bir SQL Server örneğine bağlanabilir, Computer_B'da veri dosyasına erişebilir ve bu dosyadaki verileri Computer_C bir tabloya toplu olarak aktarabilir.

Uzak veri dosyasından SQL Server'a toplu içeri aktarma

Başka bir bilgisayardan, BULK INSERT veya INSERT...SELECT * FROM OPENROWSET(BULK...) kullanarak verileri toplu olarak içeri aktarmak için, veri dosyasının iki bilgisayar arasında paylaşılması gerekir. Paylaşılan bir veri dosyası belirtmek için, genel biçimi \\Servername\Sharename\Path\Filename olan evrensel adlandırma kuralı (UNC) adını kullanın.

Ayrıca, veri dosyasına erişmek için kullanılan hesabın uzak diskte dosyayı okumak için gereken izinlere sahip olması gerekir.

Örneğin, aşağıdaki BULK INSERT ifadesi SalesOrderDetail adlı bir veri dosyasından AdventureWorks veritabanının newdata.txt tablosuna verileri toplu olarak içeri aktarır. Bu veri dosyası, \dailyorders adlı bir sistemdeki salesforce adlı paylaşılan klasörde, computer2 ağ paylaşım dizinindeki yer alır.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';

Uyarı

İstemci dosyayı SQL Server'ın bcp bağımsız olarak okuduğundan bu kısıtlama yardımcı program için geçerli değildir.

Azure Blob Depolama'dan toplu yükleme

Azure Blob depolamasından içeri aktarırken ve veriler herkese açık değilse (anonim erişim yoksa), CREATE DATABASE SCOPED CREDENTIAL ile şifrelenmiş bir SAS anahtarına dayalı olarak bir CREATE MASTER KEY oluşturun ve ardından komutunuzda kullanmak üzere bir BULK INSERT oluşturun.

Alternatif olarak, genel olmayan depolama hesaplarında veri erişim istekilerini yetkilendirmek için CREATE DATABASE SCOPED CREDENTIAL temelinde bir MANAGED IDENTITY oluşturun. MANAGED IDENTITY kullanıldığında, Azure depolamanın, gerekli Azure Blob Depolama kapsayıcıları için yönetilen kimliğe okuma/yazma erişimi sağlayan yerleşik Azure rol tabanlı erişim denetimi (RBAC) rolü olan Depolama Blob Verileri Katkıda Bulunanı rolünü atayarak örneğin yönetilen kimliğine gerekli izinleri vermesi gerekir. Azure SQL Yönetilen Örneği, sistem tarafından atanan yönetilen kimliğe sahiptir ve kullanıcı tarafından atanan bir veya daha fazla yönetilen kimliğe de sahip olabilir. İstekleri yetkilendirmek için, sistem tarafından atanan yönetilen kimlikleri veya kullanıcı tarafından atanan yönetilen kimlikleri kullanabilirsiniz. Yetkilendirme için, yönetilen örneğin default kimliği kullanılır (yani, kullanıcı tarafından atanan birincil yönetilen kimlik veya bu belirtilmemişse sistem tarafından atanan yönetilen kimlik).

Önemli

Yönetilen Kimlik, SQL Server 2025'in önceki SQL Server sürümlerinde desteklenmez.

Uyarı

Açık işlem kullanmayın veya 4861 hatası alırsınız.

BULK INSERT komutunu kullanma

Aşağıdaki örnek, sas anahtarı oluşturduğunuz Azure Blob depolama konumundaki bir csv dosyasından veri yüklemek için komutunun nasıl kullanılacağını BULK INSERT gösterir. Azure Blob depolama konumu bir dış veri kaynağı olarak yapılandırılır. Bunun için, kullanıcı veritabanındaki bir ana anahtar kullanılarak şifrelenmiş paylaşılan erişim imzasına dayalı bir veritabanı kapsamlı kimlik bilgisi gerekir.

--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

 -- NOTE: Make sure that you don't have a leading ? in SAS token, and
 -- that you have at least read permission on the object that should be loaded srt=o&sp=r, and
 -- that expiration period is valid (all dates are in UTC time)

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
          LOCATION = 'https://****************.blob.core.windows.net/invoices'
          , CREDENTIAL= MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

Aşağıdaki örnek, Yönetilen Kimlik kullanarak Azure Blob depolama konumundaki bir csv dosyasından veri yüklemek için komutunun nasıl kullanılacağını BULK INSERT gösterir. Azure Blob depolama konumu bir dış veri kaynağı olarak yapılandırılır.

--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO

--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';

-- NOTE: Make sure you have granted Storage Bob Data Contributor RBAC on storage to provides read/write access to the managed identity for the necessary Azure Blob Storage containers.

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
          LOCATION = 'https://****************.blob.core.windows.net/invoices'
          , CREDENTIAL= MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

Önemli

Azure SQL Veritabanı, Windows dosyalarından okumayı desteklemez.

OPENROWSET kullan

Aşağıdaki örnek, sas anahtarı oluşturduğunuz Azure Blob depolama konumundaki bir csv dosyasından veri yüklemek için komutunun nasıl kullanılacağını OPENROWSET gösterir. Azure Blob depolama konumu bir dış veri kaynağı olarak yapılandırılır. Bunun için, kullanıcı veritabanındaki bir ana anahtar kullanılarak şifrelenmiş paylaşılan erişim imzasına dayalı bir veritabanı kapsamlı kimlik bilgisi gerekir.

--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

 -- NOTE: Make sure that you don't have a leading ? in SAS token, and
 -- that you have at least read permission on the object that should be loaded srt=o&sp=r, and
 -- that expiration period is valid (all dates are in UTC time)

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
          LOCATION = 'https://****************.blob.core.windows.net/invoices'
          , CREDENTIAL= MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);

INSERT INTO achievements with (TABLOCK) (id, description)
SELECT * FROM OPENROWSET(
   BULK  'csv/achievements.csv',
   DATA_SOURCE = 'MyAzureBlobStorage',
   FORMAT ='CSV',
   FORMATFILE='csv/achievements-c.xml',
   FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
    ) AS DataFile;

Önemli

Azure SQL Veritabanı, Windows dosyalarından okumayı desteklemez.