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
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Bu konu, SQLXML'de istemci tarafı ve sunucu tarafı XML biçimlendirme arasındaki genel farkları açıklar.
İstemci tarafı biçimlendirmede desteklenmeyen çoklu satır kümesi sorguları
İstemci tarafı XML biçimlendirme kullandığınızda birden fazla satır kümesi oluşturan sorgular desteklenmez. Örneğin, istemci tarafı biçimlendirme belirtildiği sanal bir dizininiz olduğunu varsayın. Bir sql:query> bloğunda< iki SELECT cümlesi bulunan bu örnek şablonu ele alalım:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query>
SELECT FirstName FROM Person.Contact FOR XML Nested;
SELECT LastName FROM Person.Contact FOR XML Nested
</sql:query>
</ROOT>
Bu şablonu uygulama kodunda çalıştırabilirsiniz ve bir hata döner, çünkü istemci tarafı XML biçimlendirme birden fazla satır setinin biçimlendirilmesini desteklemez. Sorguları iki ayrı <sql:query> bloğunda belirtirseniz, istediğiniz sonucu alırsınız.
zaman damgası Haritaları İstemci ve Sunucu Tarafı Formatlamada Farklı
Sunucu tarafı XML formatlamada, zaman damgası tipinin veritabanı sütunu i8 XDR tipine eşlenir (sorguda XMLDATA seçeneği belirtildiğinde).
İstemci tarafı XML formatlamada, zaman damgası tipine ait veritabanı sütunu ya uri ya da bin.base64 XDR tipine eşlenir (bu, ankette ikili base64 seçeneğinin belirtilmesine bağlı olarak). bin.base64 XDR tipi, updategram ve bulkload özelliklerini kullanıyorsanız faydalıdır, çünkü bu tip SQL Server zaman damgası türüne dönüştürülür. Bu şekilde, ekleme, güncelleme veya silme işlemi başarılı olur.
Derin VARYANT'lar sunucu tarafı biçimlendirmede kullanılır
Sunucu tarafı XML biçimlendirmede, bir VARYANT tipinin derin tipleri kullanılır. İstemci tarafı XML biçimlendirme kullanırsanız, varyantlar Unicode dizesine dönüştürülür ve VARIANT'ın alt tipleri kullanılmaz.
NESTED Modu vs. AUTO Modu
İstemci tarafı FOR XML'nin NESTED modu, sunucu tarafı FOR XML'in AUTO moduna benzer, ancak aşağıdaki istisnalar vardır:
Sunucu tarafında AUTO modunda görünümleri sorguladığınızda, görünüm adı ortaya çıkan XML'de öğe adı olarak döner.
Örneğin, AdventureWorksdatabase'deki Person.Contact tablosunda aşağıdaki görünümün oluşturulduğunu varsayalım:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
Aşağıdaki şablon, ContactView görünümüne karşı bir sorgu belirtir ve ayrıca sunucu tarafı XML biçimlendirmesini de belirtir:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
Şablonu çalıştırdığınızda, aşağıdaki XML döner. (Sadece kısmi sonuçlar gösterilmiştir.) Eleman adlarının, sorgu uygulandığı görüşlerin isimleri olduğunu unutmayın.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
İstemci tarafı XML biçimlendirmesini ilgili NESTED modunu kullanarak belirttiğinizde, temel tablo adları ortaya çıkan XML'de öğe isim(ler) olarak döner. Örneğin, aşağıdaki revize edilmiş şablon aynı SELECT ifadesini çalıştırır, ancak XML biçimlendirmesi istemci tarafında yapılır (yani, istemci tarafı-xml şablonda true olarak ayarlanmıştır):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
Bu şablonu çalıştırdığınızda aşağıdaki XML üretilir. Bu durumda eleman adının temel tablo adı olduğunu unutmayın.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact CID="1" FName="Gustavo" LName="Achong" />
<Person.Contact CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Sunucu tarafı FOR XML'in AUTO modunu kullandığınızda, sorguda belirtilen tablo takma adları ortaya çıkan XML'de öğe adları olarak döner.
Örneğin, şu şablonu ele alalım:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT FirstName as fname,
LastName as lname
FROM Person.Contact C
FOR XML AUTO
</sql:query>
</ROOT>
Şablonun çalıştırılması aşağıdaki XML'i oluşturur:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
İstemci tarafı FOR XML'in NESTED modunu kullandığınızda, tablo adları ortaya çıkan XML'de öğe adları olarak döner. (Sorguda belirtilen tablo takma adları kullanılmaz.) Örneğin, şu şablonu ele alalım:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT FirstName as fname,
LastName as lname
FROM Person.Contact C
FOR XML NESTED
</sql:query>
</ROOT>
Şablonun çalıştırılması aşağıdaki XML'i oluşturur:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Eğer bir sorunuz dbobject sorgusu olarak sütunları döndürüyorsa, bu sütunlar için takma ad kullanamazsınız.
Örneğin, çalışan kimliği ve fotoğraf gönderen bir sorgu yürüten aşağıdaki şablonu düşünün.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT ProductPhotoID, LargePhoto as P
FROM Production.ProductPhoto
WHERE ProductPhotoID=5
FOR XML NESTED, elements
</sql:query>
</ROOT>
Bu şablonu çalıştırdığınızda, Fotoğraf sütunu dbobject sorgusu olarak döner. Bu dbobject sorgusunda ise @P var olmayan bir sütun adı ifade edilir.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Production.ProductPhoto>
<ProductPhotoID>5</ProductPhotoID>
<LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>
</Production.ProductPhoto>
</ROOT>
XML formatlama sunucuda yapılıyorsa (istemci tarafı-xml="0"), gerçek tablo ve sütun adlarının dalındığı dbobject sorgularını döndüren sütunlar için alias kullanılabilir (takma adlarınız belirtilmiş olsa bile). Örneğin, aşağıdaki şablon bir sorgu çalıştırır ve XML biçimlendirme sunucuda yapılır ( istemci tarafı-xml seçeneği belirtilmemiş ve Çalıştır İstemci seçeneği sanal kök için seçilmemiştir). Sorgu ayrıca AUTO modunu da belirtir (istemci tarafı NESTED modu değil).
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query
SELECT ProductPhotoID, LargePhoto as P
FROM Production.ProductPhoto
WHERE ProductPhotoID=5
FOR XML AUTO, elements
</sql:query>
</ROOT>
Bu şablon çalıştırıldığında, aşağıdaki XML belgesi döner (LargePhoto sütunu için dbobject sorgusunda takma adların kullanılmadığını unutmayın):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Production.ProductPhoto>
<ProductPhotoID>5</ProductPhotoID>
<LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>
</Production.ProductPhoto>
</ROOT>
İstemci tarafı vs. sunucu tarafı XPath
İstemci tarafı XPath ve sunucu tarafı XPath aynı şekilde çalışır, ancak şu farklılıklar vardır:
İstemci tarafı XPath sorguları kullandığınızda uygulanan veri dönüşümleri, sunucu tarafı XPath sorguları kullandığınızda uygulananlardan farklıdır. İstemci tarafı XPath, CONVERT mod 126 yerine CAST kullanır.
Bir şablonda istemci tarafı-xml="0" (yanlış) belirttiğinizde, sunucu tarafı XML biçimlendirme talep etmiş olursunuz. Bu nedenle, sunucu NESTED seçeneğini tanımadığı için FOR XML NESTED belirtemezsiniz. Bu bir hata oluşturur. Sunucunun tanıdığı AUTO, RAW veya EXPLICIT modlarını kullanmalısınız.
Bir şablonda istemci tarafı-xml="1" (doğru) belirttiğinizde, istemci tarafı XML biçimlendirme talep ediyorsunuz. Bu durumda, FOR XML IÇ IÇE İÇLEŞTİRİR. XML AUTO IÇIN belirtirseniz, XML formatlama sunucu tarafında gerçekleşir, ancak şablonda istemci tarafı-xml="1" belirtilmiştir.
Ayrıca Bkz.
XML Güvenlik Değerlendirmeleri IÇIN (SQLXML 4.0)
İstemci Tarafı XML Formatlama (SQLXML 4.0)
Sunucu tarafı XML Formatlama (SQLXML 4.0)