Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
XML belgelerini bir SQL Server veritabanına toplu olarak aktarabilir veya bir SQL Server veritabanından toplu olarak dışarı aktarabilirsiniz. Bu makalede her ikisine de örnek verilmiştir.
Verileri bir veri dosyasından SQL Server tablosuna veya bölümlenmemiş görünüme toplu olarak aktarmak için aşağıdaki seçenekleri kullanabilirsiniz:
bcp yardımcı programı
bcp yardımcı programını, bölümlenmiş görünümler de dahil olmak üzere bir
SELECTdeyiminin çalıştığı SQL Server veritabanındaki herhangi bir yerden verileri dışarı aktarmak için de kullanabilirsiniz.BULK INSERTINSERT ... SELECT * FROM OPENROWSET(BULK...)
Daha fazla bilgi için aşağıdaki makalelere bakın:
- bcp (SQL Server) kullanarak toplu verileri içeri ve dışarı aktarma
- VERILERI SQL Server içeri aktarmak için BULK INSERT veya OPENROWSET(BULK...) kullanın
- XML Toplu Yükleme bileşeniyle XML'yi SQL Server'a aktarma
- XML şema koleksiyonları (SQL Server)
Örnekler
- A. XML verilerini ikili bayt akışı olarak toplu içeri aktarma
- B. Xml verilerini var olan bir satırda toplu içeri aktarma
- C. DTD içeren bir dosyadan XML verilerini toplu içeri aktarma
- D. Alan sonlandırıcısını açıkça belirtmek için biçim dosyası kullanma
- E. XML verilerini toplu dışarı aktarma
XML verilerini ikili bayt akışı olarak toplu içeri aktarma
Uygulamak istediğiniz kodlama bildirimini içeren bir dosyadan XML verilerini toplu içeri aktardığınızda, SINGLE_BLOB yan tümcesinde OPENROWSET(BULK...) seçeneğini belirtin.
SINGLE_BLOB seçeneği, SQL Server'daki XML ayrıştırıcısının VERILERI XML bildiriminde belirtilen kodlama düzenine göre içeri aktarmasını sağlar.
Örnek tablo
A örneğini test etmek için Törnek tablo oluşturun.
USE tempdb;
GO
CREATE TABLE T (
IntCol INT IDENTITY(1,1),
XmlCol XML
);
GO
Örnek veri dosyası
A örneğini çalıştırmadan önce, C:\SampleFolder\SampleData3.txt kodlama düzenini belirten aşağıdaki örnek örneği içeren utf-8 kodlanmış bir dosya (UTF-8) oluşturmanız gerekir.
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<ProductDescription ProductModelID="5">
<Summary>Some Text</Summary>
</ProductDescription>
</Root>
Örnek A
Bu örnekte, SINGLE_BLOB adlı bir dosyadan verileri içeri aktarmak ve tek sütunlu tabloya bir XML örneği eklemek için INSERT ... SELECT * FROM OPENROWSET(BULK...) deyimindeki SampleData3.txt seçeneği kullanılmaktadır. Örnek tablo T.
INSERT INTO T (XmlCol)
SELECT *
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB)
AS x;
Ayrıca sütun adlarını aşağıdaki gibi açıkça belirtebilirsiniz:
INSERT INTO T (
XmlCol
)
SELECT
x.BulkColumn
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB)
AS x;
Açıklamalar
Bu durumda SINGLE_BLOB kullanarak, XML belgesinin kodlaması (XML kodlama bildirimi tarafından belirtildiği gibi) ile sunucu tarafından ima edilen dize kod sayfası arasında uyuşmazlık oluşmasını önleyebilirsiniz.
NCLOB veya CLOB veri türlerini kullanıyorsanız ve bir kod sayfası veya kodlama çakışması ile karşılaşırsanız, aşağıdakilerden birini yapmalısınız:
XML veri dosyasının içeriğini başarıyla içeri aktarmak için XML bildirimini kaldırın.
Sorgunun
CODEPAGEseçeneğinde XML bildiriminde kullanılan kodlama düzeniyle eşleşen bir kod sayfası belirtin.Veritabanı harmanlama ayarlarını Unicode olmayan bir XML kodlama düzeniyle eşleştirin veya çözün.
Xml verilerini var olan bir satırda toplu içeri aktarma
Bu örnekte, OPENROWSETörnek tablodaki mevcut bir satıra veya satırlara XML örneği eklemek için T toplu satır kümesi sağlayıcısı kullanılmaktadır.
Not
Bu örneği çalıştırmak için önce A örneğinde sağlanan test betiğini tamamlamanız gerekir. Bu örnek, tempdb.dbo.T tablosunu oluşturur ve SampleData3.txt'dan verileri toplu olarak içeri aktarır.
Örnek veri dosyası
Örnek B, önceki örnekteki SampleData3.txt örnek veri dosyasının değiştirilmiş bir sürümünü kullanır. Bu örneği çalıştırmak için bu dosyanın içeriğini aşağıdaki gibi değiştirin:
<Root>
<ProductDescription ProductModelID="10">
<Summary>Some New Text</Summary>
</ProductDescription>
</Root>
Örnek B
-- Query before update shows initial state of XmlCol values.
SELECT * FROM T;
UPDATE T
SET XmlCol = (
SELECT *
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB
) AS x
)
WHERE IntCol = 1;
GO
DTD içeren bir dosyadan XML verilerini toplu içeri aktarma
Önemli
XML ortamınızda gerekli değilse Belge Türü Tanımları (DTD) desteğini etkinleştirmemenizi öneririz. DTD desteğinin açılması sunucunuzun saldırılabilen yüzey alanını artırır ve bunu bir hizmet reddi saldırısına maruz bırakabilir. DTD desteğini etkinleştirmeniz gerekiyorsa, yalnızca güvenilen XML belgelerini işleyerek bu güvenlik riskini azaltabilirsiniz.
DTD içeren bir dosyadan XML verilerini içeri aktarmak için bcp kullandığınızda aşağıdaki hatayı alabilirsiniz:
SQLState = 42000, NativeError = 6359
Error = [Microsoft][SQL Server Native Client][SQL Server]Parsing XML with internal subset DTDs not allowed.
Use CONVERT with style option 2 to enable limited internal subset DTD support.
BCP copy %s failed
Bu sorunu geçici olarak çözmek için, OPENROWSET(BULK...) işlevini kullanarak ve ardından komutun CONVERT yan tümcesinde SELECT seçeneğini belirterek DTD içeren bir veri dosyasından XML verilerini içeri aktarabilirsiniz. Komutun temel söz dizimi şöyledir:
INSERT ... SELECT CONVERT(...) FROM OPENROWSET(BULK...)
Örnek veri dosyası
Bu toplu içeri aktarma örneğini test etmeden önce, aşağıdaki örnek örneği içeren bir dosya (C:\SampleFolder\Dtdfile.xml) oluşturun:
<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>
Örnek tablo
Örnek C, aşağıdaki T1 deyimi tarafından oluşturulan CREATE TABLE örnek tablosunu kullanır:
USE tempdb;
GO
CREATE TABLE T1(XmlCol XML);
GO
Örnek C
Bu örnekte OPENROWSET(BULK...) kullanılır ve xml verilerini CONVERTSELECTörnek tabloya aktarmak için Dtdfile.xml yan tümcesindeki T1 seçeneğini belirtir.
INSERT INTO T1
SELECT CONVERT(XML, BulkColumn, 2)
FROM OPENROWSET(
BULK 'C:\SampleFolder\Dtdfile.xml',
SINGLE_BLOB
) AS [rowsetresults];
INSERT deyimi yürütüldükten sonra, DTD XML'den çıkarılır ve T1 tablosunda depolanır.
Biçim dosyasını kullanarak alan sonlandırıcısını açıkça belirtin
Aşağıdaki örnekte, Xmltable.dataşağıdaki XML belgesini toplu olarak içeri aktarma işlemi gösterilmektedir.
Örnek veri dosyası
Xmltable.dat belge her satır için bir tane olmak üzere iki XML değeri içerir. İlk XML değeri UTF-16 ile kodlanır ve ikinci değer UTF-8 ile kodlanır.
Bu veri dosyasının içeriği aşağıdaki onaltılık dökümde gösterilir:
FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00 *..\<.?.x.m.l. .v.*
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00 *e.r.s.i.o.n.=.".*
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00 *1...0.". .e.n.c.*
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00 *o.d.i.n.g.=.".u.*
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00 *t.f.-.1.6.".?.>.*
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76 *\<.r.o.o.t.>..O.v*
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E *..w.............*
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3 *.4.4..... ..N...*
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00 *4.........\<./.r.*
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF *o.o.t.>.....z...*
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31 *\<?xml version="1*
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74 *.0" encoding="ut*
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7 *f-8"?><root>....*
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90 *................*
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83 *................*
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E *................*
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E *.........</root>*
00 00 00 00 7A *....z*
Örnek tablo
Xml belgesini toplu olarak içeri veya dışarı aktarırken, belgelerden hiçbirinde görünemeyen bir alan sonlandırıcı kullanmanız gerekir; örneğin, dört null (\0) ve ardından zharfi : \0\0\0\0z.
Bu örnekte, xTable örnek tablosu için bu alan sonlandırıcının nasıl kullanılacağı gösterilmektedir. Bu örnek tabloyu oluşturmak için aşağıdaki CREATE TABLE deyimini kullanın:
USE tempdb;
GO
CREATE TABLE xTable (xCol XML);
GO
Örnek biçim dosyası
Alan sonlandırıcısı biçim dosyasında belirtilmelidir. Örnek D, aşağıdaki çıkışı içeren Xmltable.fmt adlı XML biçiminde olmayan bir dosya kullanır:
9.0
1
1 SQLBINARY 0 0 "\0\0\0\0z" 1 xCol ""
Xml belgelerini xTable komutu veya bcp ya da BULK INSERT deyimi kullanarak toplu olarak INSERT ... SELECT * FROM OPENROWSET(BULK...) tablosuna aktarmak için bu biçim dosyasını kullanabilirsiniz.
Örnek D
Bu örnekte, Xmltable.fmtadlı xml veri dosyasının içeriğini içeri aktarmak için BULK INSERT deyimindeki Xmltable.dat biçim dosyası kullanılır.
BULK INSERT xTable
FROM 'C:\SampleFolder\Xmltable.dat'
WITH (FORMATFILE = 'C:\SampleFolder\Xmltable.fmt');
GO
XML verilerini toplu dışarı aktarma
Aşağıdaki örnek, aynı XML biçim dosyası kullanılarak önceki örnekte oluşturulan tablodan XML verilerini toplu olarak dışarı aktarmak için bcp kullanır. Aşağıdaki bcp komutunda, <server_name> ve <instance_name>, uygun değerlerle değiştirilmesi gereken yer tutucuları temsil eder:
bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>
Not
VERITABANıNDA XML verileri kalıcı hale geldiğinde SQL Server XML kodlamasını kaydetmez. Bu nedenle, XML verileri dışarı aktarıldığında XML alanlarının özgün kodlaması kullanılamaz. SQL Server, XML verilerini dışarı aktarırken UTF-16 kodlamasını kullanır.