Aracılığıyla paylaş


XML verilerinin örneklerini oluşturma

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

Bu makalede XML örneklerinin nasıl oluşturulacağı açıklanmaktadır.

SQL Server'da, XML örneklerini aşağıdaki yollarla oluşturabilirsiniz:

  • String örneklerinin tür dönüşümü.
  • SELECT yan tümcesiyle FOR XML deyimini kullanma.
  • Sabit atamaları kullanma.
  • Toplu yükleme kullanma.

Tür atama dizesi ve ikili örnekler

SQL Server dize veri türlerinden herhangi birini, örneğin [n]varchar, [n]char, [n]text, varbinaryve imagetürlerini, dizeyi xml veri türüne döküm yaparak (CAST) veya dönüştürerek (CONVERT) xml veri türüne ayrıştırabilirsiniz. Yazılmamış XML, düzgün biçimlendirilmiş olduğunu onaylamak için denetlendi. xml türüyle ilişkilendirilmiş bir şema varsa doğrulama da gerçekleştirilir. Daha fazla bilgi için bkz. Yazılan XML ile yazılmamış XMLkarşılaştırma.

XML belgeleri farklı kodlamalarla kodlanabilir (örneğin, UTF-8, UTF-16, Windows-1252). Aşağıda, dize ve ikili kaynak türlerinin XML belge kodlamasıyla nasıl etkileşime geçtiğini ve ayrıştırıcının nasıl davrandığını gösteren kurallar özetlenmiştir.

nvarchar UTF-16 veya UCS-2 gibi 2 baytlık Unicode kodlaması varsaydığından, XML ayrıştırıcısı dize değerini 2 bayt unicode kodlanmış XML belgesi veya parçası olarak değerlendirir. XML belgesinin kaynak veri türüyle uyumlu olması için 2 baytlık Unicode kodlamada kodlanması gerekir. UTF-16 kodlu bir XML belgesi, bir UTF-16 bayt sırası işareti (BOM) içerebilir, ancak içermesi gerekmez, çünkü kaynak türünün bağlamı bunun yalnızca 2 baytlık Unicode kodlu bir belge olabileceğini açıkça ortaya koyar.

varchar dizesinin içeriği, XML ayrıştırıcısı tarafından 1 bayt kodlanmış XML belgesi/parçası olarak değerlendirilir. varchar kaynak dizesinde ilişkilendirilmiş bir kod sayfası olduğundan, ayrıştırıcı, XML'nin kendisinde açık kodlama belirtilmemişse kodlama için bu kod sayfasını kullanır. XML örneğinde bir BOM veya kodlama bildirimi varsa, bu BOM veya bildirim kod sayfasıyla tutarlı olmalıdır, aksi takdirde ayrıştırıcı bir hata bildirir.

varbinary içeriği, doğrudan XML ayrıştırıcısına geçirilen bir kod noktası akışı olarak kabul edilir. Bu nedenle, XML belgesinin veya parçasının ürün reçetesini veya diğer kodlama bilgilerini satır içi olarak sağlaması gerekir. Ayrıştırıcı yalnızca kodlamayı belirlemek için akışa bakar. Bu, UTF-16 kodlanmış XML'nin UTF-16 BOM'u sağlaması gerektiği ve BOM içermeyen ve bildirim kodlaması olmayan bir örneğin UTF-8 olarak yorumlandığı anlamına gelir.

XML belgesinin kodlaması önceden bilinmiyorsa ve XML'e dönüştürmeden önce veriler XML verileri yerine dize veya ikili veri olarak geçiriliyorsa, verileri varbinaryolarak kabul etmelisiniz. Örneğin, OpenRowset()kullanarak bir XML dosyasından veri okurken, varbinary(max) değeri olarak okunacak verileri belirtmelisiniz:

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server, UTF-16 kodlaması kullanan verimli bir ikili gösterimde XML'yi dahili olarak temsil eder. Kullanıcı tarafından sağlanan kodlama korunmaz, ancak ayrıştırma işlemi sırasında dikkate alınır.

CLR kullanıcı tanımlı türleri tür dönüştürme

CLR kullanıcı tanımlı bir türün XML serileştirmesi ile bu türün örnekleri açıkça bir XML veri türüne dönüştürülebilir. CLR kullanıcı tanımlı türünün XML serileştirmesi hakkında daha fazla bilgi için bkz. CLR Veritabanı Nesnelerinden XML Serileştirme.

Yazılan XML'deki boşluğu işle

SQL Server'da, başlangıç veya bitiş etiketleri gibi işaretlemelerle sınırlanmış yalnızca boşluk karakterlerinden oluşan bir dizinin içine yer alırsa ve temsili karakterlerle kodlanmamışsa, öğe içeriğindeki boşluk yoksayılır. (CDATA bölümler yoksayılır.) Bu boşluk yönetiminin gerçekleştirilmesi, World Wide Web Consortium (W3C) tarafından yayımlanan XML 1.0 belirtiminde boşlukların nasıl tanımlandığından farklıdır. Bunun nedeni, SQL Server'daki XML ayrıştırıcısının XML 1.0'da tanımlandığı gibi yalnızca sınırlı sayıda DTD alt kümesini tanımasıdır. SQL Server'da desteklenen sınırlı DTD alt kümeleri hakkında daha fazla bilgi için bkz. CAST ve CONVERT.

Varsayılan olarak, XML ayrıştırıcısı, aşağıdaki seçeneklerden biri doğruysa dize verilerini XML'ye dönüştürdüğünde önemsiz boşluk atar:

  • xml:space özniteliği bir öğede veya onun üst öğelerinde tanımlanmamıştır.

  • Bir öğede veya onun üst öğelerinden birinde geçerli olan xml:space özniteliği varsayılan değere sahiptir.

Mesela:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

Sonuç kümesi aşağıdadır.

<root><child/></root>

Ancak, bu davranışı değiştirebilirsiniz. Xml DT örneğinde boşlukları korumak için CONVERT işlecini ve isteğe bağlı stilini parametresini 1 değerine ayarlayın. Mesela:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

stili parametresi kullanılmazsa veya değeri 0olarak ayarlanırsa, xml DT örneğinin dönüştürülmesi için önemsiz boşluk korunmaz. Dize verilerini xml DT örneklerine dönüştürürken CONVERT işlecini ve stili parametresini kullanma hakkında daha fazla bilgi için bkz. CAST ve CONVERT.

Örnek: Yazılan XML'e bir dize değeri atama ve bunu bir sütuna atama

Aşağıdaki örnek, XML parçası içeren bir dize değişkenini xml veri türüne yayınlar ve xml türü sütununda depolar:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

Aşağıdaki ekleme işlemi, bir dizeden xml türüne örtük olarak dönüştürülür:

INSERT INTO T
VALUES (3, @s);

Dizeyi CAST türünde açıkça xml olarak belirtebilirsiniz.

INSERT INTO T
VALUES (3, CAST(@s AS XML));

Veya aşağıdaki kod örneğinde gösterildiği gibi CONVERTkullanabilirsiniz:

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

Örnek: Dizeyi yazılan XML'e dönüştürün ve bir değişkene atayın

Aşağıdaki örnekte, bir dize xml türüne dönüştürülür ve xml veri türünün bir değişkenine atanır:

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

SELECT deyimini FOR XML yan tümcesiyle kullanma

sonuçları XML olarak döndürmek için FOR XML deyiminde SELECT yan tümcesini kullanabilirsiniz. Mesela:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

SELECT deyimi, xml veri türü değişkenine atama sırasında ayrıştırılan metinsel bir XML parçacığı döndürür.

yan tümcesinde FOR XML sorguları FOR XMLFOR XML olarak doğrudan bir sorgu sonucu döndürebilirsiniz.

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

Sonuç kümesi aşağıdadır.

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

Aşağıdaki örnekte, bir sorgusunun sonucu olan yazılan FOR XML, xml türü bir sütuna eklenir.

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

FOR XMLhakkında daha fazla bilgi için bkz. FOR XML (SQL Server).

Not

SQL Server, yönergesini kullanan FOR XML sorguları gibi farklı sunucu yapıları veya SQL Server Veritabanı Altyapısı sütunlarından, değişkenlerinden ve çıkış parametrelerinden XML döndürmek için TYPE veri türünün kullanıldığı xml veri türü örneklerini istemciye döndürür. İstemci uygulama kodunda, ADO.NET sağlayıcısı bu xml veri türü bilgilerinin sunucudan ikili kodlamada gönderilmesini istemektedir. Ancak, FOR XML yönergesi olmadan TYPE kullanıyorsanız, XML verileri dize türü olarak döndürür. Her durumda, istemci sağlayıcısı her zaman XML'nin her iki biçimini de işleyebilir.

Sabit atamaları kullanma

Dize sabiti, xml veri türünün bir örneğinin beklendiği yerde kullanılabilir. Bu görev, bir dizeyi XML'ye dönüştürmenin zımni CAST göreviyle aynıdır. Mesela:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

Önceki örnek, dizeyi örtük olarak xml veri türüne dönüştürür ve bir xml türü değişkenine atar.

Aşağıdaki örnek, bir xml türü sütununa sabit bir dize ekler:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Not

Yazılan XML için, XML belirtilen şemaya göre doğrulanır. Daha fazla bilgi için bkz. Yazılan XML ile yazılmamış XMLkarşılaştırma.

Toplu yüklemeyi kullan

Gelişmiş OPENROWSET işlevselliği, XML belgelerini veritabanında toplu olarak yüklemenizi sağlar. XML örneklerini dosyalardan veritabanındaki xml türü sütunlarına toplu olarak yükleyebilirsiniz. Çalışan örnekler için bkz. XML belgelerini toplu içeri ve dışarı aktarma örnekleri (SQL Server). XML belgelerini yükleme hakkında daha fazla bilgi için bkz. XML verilerini yükleme.

Bu bölümde

Makale Açıklama
XML ile ilgili sorgu seçenekleri ve korunan veriler XML örneklerinin veritabanlarında depolandığında korunmamış bölümlerini açıklar.