يكپارچگي
XML
XML[1] به عنوان يكي از
مهمترين فناوريهاي اينترنت در حال گسترش است. ساختار مبتني بر متن انعطافپذير XML به آن امكان ميدهد تا براي آرايه گستردهاي از وظايف شبكهاي
استفاده شود، از جمله انتقال داده/ سند، نمايش صفحه وب و حتي به عنوان انتقالي
براي فراخوانيهاي رويه راهدور (RPC) درون برنامه از طريق SOAP[2] . XML واقعاً زبان ميانجي زبانهاي كامپيوتر شده است.
مايكروسافت ابتدا پشتيباني XML را به SQL Server 2000
اضافه كرد و اين پشتيباني با بخش FOR XML
به عنوان بخشي از عبارت SELECT
و تابع OpenXML شروع شد. هنگامي كه XML
به رشد سريع خود در پذيرش و كاربرد جهاني ادامه داد، مايكروسافت سريعاً عملكردي
اضافي را با توليد مجموعهاي از نسخههاي وب فراهم كرد. SQL for XML 1.0 پشتيباني از UpdateGrams،
Templates و BulkLoad را به نسخه پايه SQL Server 2000
اضافه كرد. دو نسخه وب بعدي، SQLXML 2.0
و SQLXML
3.0، باعث بهبود بيشتر SQL Server 2000 با افزودن پشتيباني از ديدگاههاي XML و SOAP به علاوه چندين قابليت جديد ديگر شدند. در حالي كه پشتيباني SQL Server 2000 از XML،
نقطه شروع خوبي را براي يكپارچه كردن اسناد XML سلسله مراتبي با داده رابطهاي SQL Server فراهم كرد، محدوديتهايي نيز داشت، هنگامي كه داده XML در يك پايگاه داده SQL Server
با استفاده از نوع داده Text
يا Image ذخيره ميشد، بسيار كوچك بود كه بتوانيد با آن كار كنيد. SQL Server 2000 قادر به پرسوجوي طبيعي داده سلسله مراتبي كه سند XML را تشكيل ميدهد، بدون استفاده از كد سمت كلاينت يا T-SQL پيچيده نبود.
SQL Server 2005
بر طبق اين نقطه شروع با افزودن پشتيباني از برخي از ويژگيهاي XML جديد ساخته شده است. SQL Server 2005
در يك سطح بالا، سطح جديدي از حافظه يك شكل را براي XML و داده رابطهاي فراهم كرده است. SQL Server 2005 يك نوع داده XML
جديد را اضافه كرده است كه پشتيباني از پرسوجوهاي XML طبيعي و نوعگذاري داده قوي را با مرتبط كردن نوع داده XML به يك XSD[3] فراهم ميكند.
علاوه بر اين، نگاشت دو جهته را بين داده رابطهاي و داده XML فراهم كرده است. پشتيباني XML
به خوبي در موتور پايگاه داده رابطهاي SQL Server 2005
يكپارچه شده است، زيرا پشتيباني از تريگرها را در XML، كپيسازي داده XML،
بارگذاري حجيم داده XML
و پشتيباني بهبود يافته براي دستيابي داده از طريق SOAP و تعدادي بهبود ديگر را فراهم كرده است. در اين فصل، با مهمترين
ويژگيهاي XML جديد فراهم شده توسط SQL Server 2005
آشنا خواهيد شد.
بدون شك، مهمترين بهبود مربوط به XML كه مايكروسافت به SQL Server 2005
اضافه كرده است، پشتيباني از نوع داده XML
طبيعي است. نوع داده XML
كه عيناً XML ناميده ميشود، ميتواند به عنوان ستوني در يك جدول يا يك متغير
يا پارامتر در يك رويه ذخيره شده استفاده شود. اين نوع ميتواند براي ذخيره داده
نوعدار و بدون نوع استفاده شود. اگر داده ذخيره شده در يك ستون XML داراي طرحواره XSD
نباشد، آنگاه بدون نوع در نظر گرفته ميشود. اگر يك طرحواره XSD مرتبط وجود داشته باشد، آنگاه SQL Server 2005 طرحواره را بررسي ميكند تا مطمئن شود كه حافظه داده با تعريف
طرحواره كامپايل ميشود. در تمام موارد، SQL Server 2005
دادهاي را كه در نوع داده XML
ذخيره ميشود، بررسي ميكند تا مطمئن شود سند XML خوش فرم است. اگر داده خوش فرم نباشد، SQL Server 2005 خطايي را به وجود خواهد آورد و داده ذخيره نخواهد شد. نوع داده XML ميتواند حداكثر 2GB داده را بپذيرد و شبيه نوع داده varbinary(max) ذخيره ميشود. ليست زير ايجاد جدولي ساده را نشان ميدهد كه از
نوع داده XML جديد براي يكي از ستونهاي خود استفاده ميكند.
CREATE TABLE MyXMLDocs (DocID INT PRIMARY KEY IDENTITY, MyXmlDoc XML)
مهمترين نكتهاي كه در اين مثال توجه
برانگيز است، تعريف ستون MyXmlDoc
است كه از نوع داده XML
براي مشخص كردن اين مسأله استفاده ميكند كه اين ستون، داده XML را ذخيره خواهد كرد. ميتوانيد داده XML را با استفاده از عبارت T-SQL INSERT
استاندارد در يك ستون XML ذخيره
كنيد. اين مثال نحوه پر كردن يك ستون XML را با استفاده از يك عبارت INSERT ساده نشان ميدهد:
INSERT INTO MyXmlDocs Values('<MyXMLDoc> <DocumentID>1</DocumentID> <DocumentText>Text</DocumentText></MyXMLDoc>')
توجه: نكته مهمي كه
در اينجا مطرح ميشود اين است كه به اين دليل كه داده XML بدون نوع است، هر سند XML
معتبري ميتواند در نوع داده XML
درج شود.
نوع داده XML طبيعي بررسي ميكند تا مطمئن شود كه هر دادهاي كه در يك ستون يا
متغير XML ذخيره ميشود، يك سند XML
معتبر است. هرچند، مايكروسافت نوع داده XML
را طوري طراحي كرده است تا بتواند با استفاده از يك طرحواره XSD، از تأييد اعتبار سند بهتري پشتيباني كند. هنگامي كه يك طرحواره XSD براي يك ستون نوع داده XML
تعريف ميشود، موتور SQL Server
بررسي ميكند تا مطمئن شود كه تمام دادهاي كه در ستون XML ذخيره ميشود، با تعريف آن در طرحواره XSD مطابقت دارد.
اين ليست يك طرحواره XSD ساده را براي سند XML
سادهاي نشان ميدهد كه در مثال قبل استفاده شد:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="MyXMLDocSchema" xmlns="MyXMLDocSchema"> <xs:element name="MyXMLDoc"> <xs:complexType> <xs:sequence> <xs:element name="DocumentID" type="xs:string" /> <xs:element name="DocumentBody" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element></xs:schema>
اين طرحواره داده XSD از فضاي MyXMLDocSchema استفاده كرده و يك سند XML را تعريف ميكند كه داراي عنصر مركبي به نام MyXMLDoc است. عنصر مركب MyXMLDoc
حاوي دو عنصر ساده است. اولين عنصر ساده بايد DocumentID و دومي DocumentBody ناميده شوند. هر دو عنصر حاوي داده نوع رشتهاي XML هستند.
براي ايجاد يك متغير يا ستون XML نوعدار قوي، ابتدا بايد طرحواره XSD را با SQL Server
با استفاده از عبارت CREATE XMLSCHEMA T-SQL DDL
رجيستر كنيد. ليست زير نحوه تركيب كردن عبارت CREATE XML SCHEMA
COLLECTION را با MyXMLDocSCHEMA براي رجيستر كردن طرحواره با پايگاه داده SQL Server 2005 نشان ميدهد:
CREATE XML SCHEMA COLLECTION MyXMLDocSchema ASN'<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://MyXMLDocSchema"> <xs:element name="MyXMLDoc"> <xs:complexType> <xs:sequence> <xs:element name="DocumentID" type="xs:string" /> <xs:element name="DocumentBody" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element></xs:schema>'
عبارت CREATE XML SCHEMA
COLLECTION DLL يك
آرگومان ميگيرد كه نام كلكسيون است. سپس، بعد از بخش AS، يك طرحواره XSD
معتبر مورد نياز است كه در گيومه قرار گرفته باشد. اگر طرحواره معتبر نباشد،
هنگام اجراي عبارت، خطايي صادر خواهد شد. عبارت CREATE XML SCHEMA
COLLECTION خاص پايگاه داده
است و طرح واره رجيستر شده تنها ميتواند در پايگاه داده براي آن طرحواره رجيستر
شده، مورد دستيابي قرار گيرد.
هنگامي كه طرحواره XML را در SQL Server 2005
رجيستر كرديد، ميتوانيد ستونها و متغيرهاي XML را به آن طرحواره مرتبط كنيد. انجام اين كار اطمينان ميدهد كه
هر سند XML اي كه در اين ستونها يا متغيرها وجود دارد، به تعريف فراهم شده توسط
طرحواره مربوطه مرتبط ميشود. اين مثال به شما نشان ميدهد چگونه ميتوانيد جدولي
را ايجاد كنيد كه از يك ستون XML
نوعدار قوي استفاده كند:
CREATE TABLE MyXMLDocs (DocID INT PRIMARY KEY IDENTITY, MyXmlDoc XML(MyXMLDocSchema))
در اينجا ميتوانيد ببينيد كه جدول MyXMLDocs با استفاده از عبارت CREATE TABLE
همانند مثال قبل ايجاد شده است. هرچند، در اين مورد، ستون MyXMLDoc با استفاده از آرگوماني ايجاد ميشود كه نام تعريف طرحواره XSD رجيستر شده را مشخص ميكند. اگر به ليست قبل مراجعه كنيد، ميتوانيد
ببينيد كه طرحواره با استفاده از نام MyXMLDocSchema
رجيستر شده است. بعد از مرتبط شدن ستون MyXMLDoc
با طرحواره رجيستر شده، هر دادهاي كه در اين ستون درج شود، برطبق تعريف طرحواره
نوعدار قوي خواهد شد و هر تلاشي براي درج آن داده كه با تعريف طرحواره تطابق
نداشته باشد، پذيرفته نخواهد شد. اين ليست يك عبارت INSERT را تشريح ميكند كه ميتواند داده را به ستون MyXMLDoc نوعدار قوي اضافه كند:
INSERT INTO MyXMLDocs Values ('<MyXMLDoc xmlns="http://MyXMLDocSchema"> <DocumentID>1</DocumentID> <DocumentBody>"My text"</DocumentBody> </MyXMLDoc>')
توجه: به دليل اين
كه اين مثال از يك نوع داده XML
نوعدار استفاده ميكند، اين داده بايد با تعريف فراهم شده توسط طرح واره XSD مرتبط تطابق داشته باشد.
در اين مورد، سند XML بايد به فضاي نام XML
مرتبط http://MyXMLDocSchema مراجعه كند و بايد حاوي عنصر مركبي به نام MyXMLDoc باشد كه به نوبت حاوي عناصر DocumentID و DocumentBody است. موتور SQL Server
هر تلاشي براي درج هر سند XML
ديگر را در ستون MyXMLDoc نميپذيرد. اگر دادهاي با طرحواره XSD تأمين شده تطابق نداشته باشد، MyXMLDoc پيام خطايي را برميگرداند، شبيه آنچه كه در اينجا نشان داده
شده است:
Msg 6965, Level 16, State 1, Line 1XML Validation: Invalid content,expectedelement(s):MyXMLDocSchema:DocumentID where element 'MyXMLDocSchema:Do' wasspecified
توجه: همانگونه كه
ممكن است از رابطه وابسته آنها انتظار داشته باشيد، اگر طرحوارهاي را به ستوني
در جدول نسبت دهيد، آن جدول بايد قبل از بهنگامرساني تعريف طرح واره، تغيير كند
يا حذف شود.
بازيابي
يك طرحواره XML
رجيستر شده
هنگامي كه طرحوارهاي را با استفاده از CREATE XML SCHEMA
COLLECTION وارد ميكنيد،
اجزاي طرحواره در فوق داده SQL Server
ذخيره ميشوند. طرحواره ذخيره شده ميتواند با پرسوجوي ديدگاه سيستمي Sys.xml_namespaces فهرست شود، همانگونه كه ميتوانيد در اين مثال ببينيد:
SELECT * FROM sys.xml_namespaces
اين عبارت مجموعه نتيجهاي را برخواهد
گرداند كه تمام طرحوارههاي رجيستر شده را در پايگاه دادهاي نظير اين نشان ميدهد:
xml_collection_id name xml_namespace_id----------------------------- ---------------------------------- --------1 http://www.w3.org/2001/XMLSchema 165540 http://MyXMLDocSchema 1 (2 row(s) affected)
همچنين ميتوانيد از تابع XML_SCHEMA_NAMESPACE جديد براي بازيابي طرحواره XML استفاده كنيد. اين پرسوجو، طرحوارهاي را از پايگاه داده براي
يك فضاي نام معين بازيابي ميكند.
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MyXMLDocSchema')
اين عبارت مجموعه نتيجهاي را برخواهد
گرداند كه تمام ستونهايي را نشان ميدهد كه از طرحواره رجيستر شده استفاده ميكند،
همانگونه كه ميتوانيد در اين ليست ببينيد:
----------------------------------------------------------------------<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchematargetNamespace="http://MyXMLDocSchema" xmlns:t=http://MyXMLDocSchemaelementFormDefault="qualified"><xsd:elementname="MyXMLDoc"><xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:any (1 row(s) affected)
صفت elementname ستونهايي را فهرست ميكند كه از نوع داده XML نوعدار استفاده ميكنند.
SQL Server 2005
چندين متد تعبيه شده جديد را فراهم كرده است كه بسيار شبيه انواع تعريف شده كاربر
براي كار كردن با نوع داده XML
كار ميكند. اين متدها به شما امكان ميدهند تا با استفاده از نوع داده XML بهطور عمقي به محتويات XML
ذخيره شده وارد شويد. براي تسهيل كردن يكپارچگي عمقي، نياز به روشي براي پرسوجو و
دستكاري داده ذخيره شده با استفاده از نوع داده XML جديد داريد و اين كه چه چيزي متدهاي نوع داده XML را فعال ميكند.
Exists
(XQuery, [node ref]
متد Exists نوع داده XML
به شما امكان ميدهد تا محتويات يك سند XML
را براي وجود عناصر يا صفات استفاده كننده از يك عبارت XQuery بررسي كنيد (مطالب بيشتر درباره زبان XQuery در بخش بعد ارايه ميشود). اين ليست نحوه استفاده از متد Exists نوع داده XML
را نشان ميدهد:
SELECT * FROM MyXMLDocsWHERE MyXmlDoc.exist('declare namespace xd=http://MyXMLDocSchema/xd:MyXMLDoc[xd:DocumentID eq "1"]') = 1
اولين پارامتر متد XML Exists ضروري است و يك عبارت XQuery
را ميگيرد. دومين پارامتر اختياري است و مرجع گرهي را در سند XML مشخص ميكند. در اينجا، XQuery
تساوي عنصر DocumentID را با 1 بررسي ميكند. يك فضاي نام معرفي شده است، زيرا ستون MyXMLDoc داراي يك طرحواره مرتبط است. متد Exists در صورتي ميتواند مقدار TRUE(1)
را برگرداند كه عبارات XQuery
يك گره را برگردانند و چنانچه عبارت يك گره XML را برنگرداند، FALSE(0)
را برميگرداند و در صورت null
بودن نمونه نوع داده XML،
NULL را برميگرداند. ميتوانيد نتايج متد XML Exists را در اينجا ببينيد:
DocID MyXmlDoc----------- ---------------------------------------------------------1 <MyXMLDocxmlns="http://MyXMLDocSchema"><DocumentID>1</DocumentID> <DocumentBody>"My text"</DocumentBody></MyXMLDoc> (1 row(s) affected)
Modify
(XML DML)
همانگونه كه ممكن است حدس زده باشيد،
متد Modify نوع داده XML
به شما امكان ميدهد تا يك سند XML
ذخيره شده را اصلاح كنيد. ميتوانيد از متد Modify براي بهنگامرساني كل سند XML
يا بخش منتخبي از آن استفاده كنيد. ميتوانيد مثالي از كاربرد متد Modify را در اين ليست ببينيد:
UPDATE MyXMLDocsSET MyXMLDoc.modify('declare namespace xd=http://MyXMLDocSchema replace value of (/xd:MyXMLDoc/xd:DocumentBody)[1] with "My New Body"')WHERE DocID = 1
متد Modify نوع داده XML
از يك عبارت XML
DML به عنوان پارامتر خود استفاده ميكند.
XML
DML يك توسعه مايكروسافتي براي زبان XQuery است كه اصلاح اسناد XML
را ممكن ميسازد. زبان XQuery
از Replace
value of عبارات DELETE XML DML و INSERT پشتيباني ميكند. در اين مثال، با توجه به اين كه ستون MyXMLDoc XML نوع دار است، عبارت XML DML
بايد فضاي نامي را براي طرحواره مشخص كند. سپس، ميتوانيد محل فرمان
Replace
value of XML DML مورد استفاده براي
جايگزين كردن مقدار عنصر DocumentBody
با مقدار جديد "My New
Body" براي رديفي كه
ستون DocID رابطهاي آن با يك برابر است، ببينيد. بخش Replace value of بايد تنها يك گره را مشخص كند يا ناموفق خواهد بود. بنابراين،
اولين گره با استفاده از نماد [1] مشخص ميشود.
توجه: در حالي كه
اين مثال كارايي عمل جايگزيني را تشريح ميكند، متد Modify نيز از عمليات حذف و اضافه پشتيباني ميكند.
Query
(XQuery, [node ref])
متد Query نوع داده XML
ميتواند كل محتويات يك سند XML
يا بخش منتخبي از سند XML را بازيابي
كند. ميتوانيد مثالي از كاربرد متد Query را در اين ليست ببينيد:
SELECT DocID, MyXMLDoc.query('declare namespace xd=http://MyXMLDocSchema /xd:MyXMLDoc/xd:DocumentBody') AS BodyFROM MyXMLDocs
اين عبارت XQuery، مقداري را از عنصر DocumentBody
سند XML برميگرداند. مجدداً، فضاي نام مشخص شده است، زيرا نوع داده MyXMLDoc داراي يك طرحواره مربوطه به نام MyXMLDocSchema است. در اين مثال، ميتوانيد ببينيد كه چگونه SQL Server 2005 داده ستون رابطهاي را با داده XML يكپارچه كرده است. در اينجا، DocID از يك ستون رابطهاي ميآيد، در حالي كه عنصر DocumentBody خارج از ستون XML
پرسوجو ميشود. اين ليست نتايج XQuery
را نشان ميدهد:
DocID Body------ --------------------------------------------------------------------------------1 <xd:DocumentBody xmlns:xd="http://MyXMLDocSchema"> My New Body</xd:DocumentBody>2 <xd:DocumentBody xmlns:xd="http://MyXMLDocSchema"> "My 2nd text"</xd:DocumentBody> (2 row(s) affected)
Value
(XQuery, [node ref])
متد Value اقتباس مقادير عددي از يك نوع داده XML را ممكن ميسازد. ميتوانيد مثالي از نحوه استفاده از متد Value نوع داده XML
را در اين ليست ببينيد:
SELECT MyXMLDoc.value('declare namespace xd=http://MyXMLDocSchema (/xd:MyXMLDoc/xd:DocumentID)[1]', 'int') AS IDFROM MyXMLDocs
برخلاف متدهاي ديگر نوع داده XML، متد XML Value
نياز به دو پارامتر دارد. اولين پارامتر يك عبارت XQuery است و دومين پارامتر، نوع داده SQL را مشخص ميكند كه مقدار عددي برگردانده شونده از متد Value است. اين مثال تمام مقادير موجود در عنصر DocumentID را برميگرداند و آنها را به نوع داده int تبديل ميكند، همانگونه كه در اين نتايج نشان داده شده است:
ID-----------12 (2 row(s) affected)
در بخش قبل، نحوه استفاده از XQuery در متدهاي نوع داده XML
جديد بيان شد. XQuery برطبق زبان XPath
است كه توسط W3C (www.w3c.org) براي پرسوجوي داده XML
ايجاد شده است. XQuery زبان XPath
را با افزودن قابليت بهنگامرساني داده و پشتيباني براي تكرار بهتر و مرتبسازي
نتايج توسعه داده است. در زمان نوشتن اين كتاب، زبان XQuery كه توسط SQL Server 2005
استفاده ميشود، يك پيادهسازي اوليه برطبق كاري ماهرانه از استاندارد XQuery است كه به W3C
واگذار شده است، بنابراين تغيير مقداري از جزييات پيادهسازي قبل از عرضه رسمي SQL Server 2005 امكانپذير است. شرح زبان XQuery
خارج از حيطه اين كتاب است، ولي براي جزييات بيشتر درباره استاندارد W3C XQuery، ميتوانيد به http://www.w3.org/XML/Query مراجعه كنيد.
نوع داده XML از حداكثر 2GB پشتيباني ميكند كه بسيار بزرگ است. اندازه داده XML و كاربرد آن ميتواند تأثير بزرگي بر كارآيي حاصله سيستم داشته
باشد، در حالي كه داده XML
را پرسوجو ميكنيد. براي بهبود كارآيي پرسوجوهاي XML، SQL
Server 2005 توانايي ايجاد
ايندكسها روي ستونهايي را كه داراي نوع داده XML هستند، فراهم كرده است.
براي ايجاد يك ايندكس XML روي يك ستون نوع داده XML،
يك كليد اصلي كلاستر شده بايد براي جدول وجود داشته باشد. علاوه بر اين، اگر نياز
به تغيير كليد اصلي جدول داشته باشيد، ابتدا بايد ايندكس XML را حذف كنيد. يك ايندكس XML
تمام عناصر ستون XML را دربرميگيرد و ميتوانيد تنها يك ايندكس XML در هر ستون داشته باشيد. به دليل اين كه ايندكسهاي XML از همان فضاي نام ايندكسهاي رابطهاي عادي SQL Server استفاده ميكنند، ايندكسهاي XML نميتوانند داراي نامي مشابه يك ايندكس موجود باشند. ايندكسهاي XML ميتوانند تنها روي انواع داده XML در يك جدول ايجاد شوند. آنها نميتوانند روي ستونهايي در ديدگاهها
يا روي متغيرهاي نوع داده XML
ايجاد شوند. يك XML اصلي شامل يك نمايش قطعه قطعه دايمي از داده در ستون XML است. كدي براي ايجاد يك ايندكس XML اصلي در اين ليست نشان داده شده است:
CREATE PRIMARY XML INDEX MyXMLDocsIdx
ON MyXMLDocs(MyXMLDoc)
اين مثال، ايجاد ايندكس XML اصلي به نام MyXMLDocIdx
را نشان ميدهد. اين ايندكس روي ستون نوع داده MyXMLDoc XML در جدول MyXMLDocs
ايجاد ميشود. درست شبيه ايندكسهاي عادي SQL Server،
ايندكسهاي XML ميتوانند با پرسوجوي ديدگاه sys.indexes مشاهده شوند.
SELECT * FROM sys.indexes WHERE name =
'MyXMLDocsIdx'
علاوه بر ايندكس اصلي، همچنين ميتوانيد
ايندكسهاي XML ثانويه را بسازيد. ايندكسهاي ثانويه روي يكي از اين صفات سند
ساخته ميشوند:
ü
Path: مسير سند كه براي ساخت ايندكس استفاده ميشود.
ü
Value: مقادير سند كه براي ساخت ايندكس استفاده ميشود.
ü
Property: خصوصيات اسناد براي ساخت ايندكس استفاده ميشوند.
ايندكسهاي ثانويه هميشه به همان روش
ايندكس XML اصلي پارتيشنبندي ميشوند. اين ليست، ايجاد يك ايندكس XML مسير ثانويه را نشان ميدهد:
CREATE XML INDEX My2ndXMLDocsIdx ON MyXMLDocs(MyXMLDoc) USING XML INDEX MyXMLDocsIdx FOR PATH
بخش FOR XML ابتدا براي عبارت T-SQL SELECT
در SQL
Server 2000 معرفي شد. اين بخش
در SQL
Server 2005 بهبود يافته است.
برخي از قابليتهاي جديدي كه در پشتيباني FOR XML
در SQL
Server 2005 پيدا ميشود، شامل
پشتيباني براي نوع داده XML،
انواع داده تعريف شده كاربر، نوع داده timestamp
و پشتيباني بهبود يافته براي داده رشتهاي است. علاوه بر اين، بهبودهاي FOR XML همچنين شامل پشتيباني براي يك رهنمود Type جديد، پرسوجوهاي FOR XML
تودرتو و توليد طرح واره XSD
درون برنامهاي است.
هنگامي كه انواع داده XML با استفاده از رهنمود Type
بخشهاي FOR
XML برگردانده ميشوند، سريالي نميشوند.
در عوض نتايج به عنوان نوع داده XML
برگردانده ميشود. ميتوانيد مثالي از كاربرد بخش FOR XML را با رهنمود XML Type
ببينيد:
SELECT DocID, MyXMLDoc FROM MyXMLDocs WHERE DocID=1 FOR XML AUTO, TYPE
اين پرسوجو، ستون DocID رابطهاي را به همراه ستون نوع داده MyXMLDoc XML برميگرداند. اين پرسوجو از بخش FOR XML AUTO براي برگرداندن نتايج به عنوان XML استفاده ميكند. رهنمود Type
مشخص ميكند كه نتايج به عنوان يك نوع داده XML برگردانده خواهند شد. ميتوانيد نتايج استفاده از
رهنمود Type را در اينجا ببينيد:
<MyXMLDocs DocID="1"> <MyXMLDoc> <MyXMLDoc xmlns="MyXMLDocSchema"> <DocumentID>1</DocumentID> <DocumentBody>My New Body</DocumentBody> </MyXMLDoc> </MyXMLDoc></MyXMLDocs>
توجه: رهنمود Type نوع داده XML
را به عنوان يك جريان متوالي برميگرداند. من فرمتبندي را به ليست قبل اضافه كردهام
تا خواناتر شود.
SQL Server 2000
محدود به استفاده از بخش FOR XML
در سطح بالاي يك پرسوجو بود زيرا پرسوجوها نميتوانستند از بخش FOR XML استفاده كنند. SQL Server 2005
توانايي استفاده از پرسوجوهاي FOR XML
تودرتو را اضافه كرده است. پرسوجوهاي تودرتو براي برگرداندن چندين آيتم مفيد
هستند كه يك رابطه والد-فرزند بين آنها وجود دارد. مثالي از اين نوع رابطه ممكن
است ركوردهاي هدر سفارش و جزييات سفارش باشند؛ مثالي ديگر ممكن است دستهها و
زيردستههاي محصول باشند. ميتوانيد مثالي از كاربرد يك بخش FOR XML تودرتو را در اين ليست ببينيد:
SELECT DocID, MyXMLDoc, (SELECT MyXMLDoc FROM MyXMLDocs2 WHERE MyXMLDocs2.DocID = MyXMLDocs.DocID FOR XML AUTO, TYPE)FROM MyXMLDocs Where DocID = 2 FOR XML AUTO, TYPE
در اين مثال، پرسوجوي خارجي در جدول MyXMLDocs با زيرپرسوجويي در جدول MyXMLDocs2
تركيب ميشود (براي اين مثال، يك كپي ساده از جدول MyXMLDocs). مهمترين نكته توجه برانگيز در اين ليست، توانايي SQL Server 2005 براي استفاده از بخش FOR XML
در زير پرسوجوست. در اين مورد، زيرپرسوجو از رهنمود Type براي برگرداندن نتايج به عنوان يك نوع داده XML طبيعي استفاده ميكند. اگر رهنمود Type استفاده نشود، آنگاه نتايج به عنوان يك نوع داده nvarchar برگردانده ميشوند و داده XML
داراي موجوديت ميشود. ميتوانيد نتايج پرسوجوي FOR XML تودرتو را در اين ليست ببينيد:
<MyXMLDocs DocID="2"> <MyXMLDoc> <MyXMLDoc xmlns="MyXMLDocSchema"> <DocumentID>1</DocumentID> <DocumentBody>"My text"</DocumentBody> </MyXMLDoc> </MyXMLDoc></MyXMLDocs>
توجه: فرمتبندي را
براي خواناتر شدن به ليست قبل اضافه كردهام.
ويژگي جديد ديگر در پشتيباني SQL Server 2005 FOR
XML، توانايي توليد يك طرحواره XSD با افزودن رهنمود XMLSCHEMA
به بخش FOR
XML است. ميتوانيد مثالي از كاربرد
رهنمود XMLSCHEMA جديد را در اين ليست ببينيد:
SELECT MyXMLDoc FROM MyXMLDocs WHERE DocID=1 FOR XML AUTO, XMLSCHEMA
در اين مورد، به دليل اين كه رهنمود XMLSCHEMA به بخش FOR XML
اضافه شده است، اين پرسوجو طرحوارهاي را توليد كرده و برميگرداند كه ستون XML خاصي را به همراه نتيجه XML
از ستون منتخب تعريف ميكند. رهنمود XMLSCHEMA
تنها با حالات FOR
XML AUTO و FOR XML RAW كار ميكند و نميتواند در حالت FOR XML EXPLICIT استفاده شود. اگر رهنمود XMLSCHEMA
در يك پرسوجوي تودرتو استفاده شود، تنها ميتواند در سطح بالاي پرسوجو استفاده
شود. طرحواره XSD كه از اين پرسوجو توليد ميشود، در اين ليست نشان داده شده است:
<xsd:import namespace="http://MyXMLDocSchema" /> <xsd:element name="MyXMLDocs"> <xsd:complexType> <xsd:sequence> <xsd:element name="MyXMLDoc" minOccurs="0"> <xsd:complexType sqltypes:xmlSchemaCollection="[tecadb].[dbo].[MyXMLDocSchema]"> <xsd:complexContent> <xsd:restriction base="sqltypes:xml"> <xsd:sequence> <xsd:any processContents="strict" namespace="http://MyXMLDocSchema" /> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema><MyXMLDocs xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1"> <MyXMLDoc> <MyXMLDoc xmlns="http://MyXMLDocSchema"> <DocumentID>1</DocumentID> <DocumentBody>My New Body</DocumentBody> </MyXMLDoc> </MyXMLDoc></MyXMLDocs>
رهنمود XMLSCHEMA ميتواند چندين طرحواره را برگرداند، ولي هميشه حداقل دو طرحواره
را برميگرداند: يك طرح واره براي فضاي نام SqlTypes برگردانده ميشود و طرحواره دومي كه نتايج پرسوجوي FOR XML را بيان ميكند. در ليست قبل، ميبينيد كه شرح طرحواره ستون نوع
داده XML در <xsl:element="MyXMLDocs"> شروع ميشود. سپس، نتايج XML
ميتوانند در شروع خط با <MyXMLDoc
xmls ="urn:schemas-microsoft.com:sql:SqlRowSet1"> ببينيد.
توجه: همچنين ميتوانيد
يك طرحواره XDR[4] را با استفاده از
رهنمود XMLDATA در تركيب با بخش FOR XML
توليد كنيد.
بخش FOR XML براي بازيابي XML
از پايگاه داده SQL
Server 2005 عالي است. بخش FOR XML لزوماً يك سند XML
را از داده رابطهاي ايجاد ميكند. كلمه كليدي OPENXML قرينه بخش FOR XML
است. تابع OPENXML يك مجموعه رديف رابطهاي را طبق يك سند XML فراهم ميكند. براي استفاده از عملكرد SQL Server OPENXML، ابتدا بايد رويه ذخيره شده sp_xml_preparedocument را فراخواني كنيد كه سند XML
را با استفاده از DOM[5] XML تجزيه كرده و هندلي را براي OPENXML برميگرداند. سپس OPENXML
يك ديدگاه مجموعه رديف از سند XML
تجزيه شده فراهم ميكند. هنگامي كه كار كردن با سند را به پايان رسانديد، آنگاه
رويه ذخيره شده sp_xml_removedocument را فراخواني كنيد تا منابع سيستم مصرف شده توسط OPENXML و XML
DOM را آزاد كنيد. ميتوانيد مروري از
اين فرآيند را در شكل 1-7 ببينيد.

در SQL Server 2005، پشتيباني OPENXML
توسعه يافته است تا پشتيباني از نوع داده XML
جديد و نوع داده تعريف شده كاربر جديد را داشته باشيم. مثال زير نحوه استفاده از OPENXML را در الحاق با يك بخش WITH
در الحاق با نوع داده XML
جديد نشان ميدهد:
DECLARE @hdocument intDECLARE @doc varchar(1000)SET @doc ='<MyXMLDoc> <DocumentID>1</DocumentID> <DocumentBody>"OPENXML Example"</DocumentBody> </MyXMLDoc>'EXEC sp_xml_preparedocument @hdocument OUTPUT, @docSELECT * FROM OPENXML (@hdocument, '/MyXMLDoc', 10) WITH (DocumentID varchar(4), DocumentBody varchar(50))EXEC sp_xml_removedocument @hdocument
در بالاي اين ليست، ميتوانيد ببينيد كه
دو متغير معرفي شدهاند. متغير @hdocument براي ذخيره هندل سند XML
كه توسط رويه ذخيره شده sp_xml_preparedocument
برگردانده ميشود، استفاده خواهد شد، در حالي كه متغير @doc حاوي خود سند XML
نمونه است. سپس، رويه ذخيره شده sp_xml_preparedocument اجرا شده و دو متغير را ارسال ميكند. رويه ذخيره شده sp_xml_preparedocument از XML DOM
براي تجزيه سند XML استفاده كرده و سپس هندلي را براي سند تجزيه شده در متغير @hdocument
برميگرداند. آنگاه اين هندل سند به كلمه كليدي OPENXML مورد استفاده در عبارت SELECT
ارسال ميشود.
اولين پارامتر مورد استفاده OPENXML، هندل سند موجود در @hdocument است. دومين پارامتر، يك الگويXPath است كه خاص گرهها در سند XML
است كه مجموعه رديف رابطهاي را خواهد ساخت. سومين پارامتر، نوع نگاشت XML به رابطهاي را مشخص ميكند كه انجام خواهد شد. مقدار 2 نشان ميدهد
كه نگاشت عنصرگرا استفاده خواهد شد. يك مقدار 1 نشان ميدهد كه نگاشت صفتگرا
انجام ميشود. بخش WITH فرمت مجموعه رديفي را كه برميگرداند، فراهم ميكند. در اين مثال،
بخش WITH مشخص ميكند كه مجموعه رديف برگردانده شده شامل دو ستون varchar به نامهاي DocumentID
و DocumentBody است. در حالي كه اين مثال نشان ميدهد نام مجموعه رديفها با
عناصر XML مطابقت دارد، ولي اين يك شرط الزامي نيست. بالاخره، رويه ذخيره
شده sp_xml_removedocument براي آزاد كردن منابع سيستم اجرا ميشود.
عبارت SELECT كه از ويژگي OPENXML
استفاده ميكند، مجموعه رديفي را برخواهد گرداند كه شامل مقدار عناصر سند XML است. ميتوانيد نتايج كاربرد OPENXML را در اين ليست ببينيد:
DocumentID DocumentBody---------- --------------------------------------------------1 "OPENXML Example" (1 row(s) affected)
يكي از اولين مواردي كه احتمالاً قصد
داريد انجام دهيد تا از نوع داده XML
جديد بهره ببريد، بارگذاري اسناد XML
در ستونهاي XML از ديسك است. ويژگي بارگذاري حجيم XML اين كار را بسيار ساده كرده است. اين ويژگي يك مكانيزم بسيار سريع
براي بارگذاري اسناد XML
در ستونهاي SQL
Server فراهم ميكند. ميتوانيد
مثالي از كاربرد بارگذاري حجيم XML
را در اين ليست ببينيد:
INSERT into MyXMLDocs(MyXMLDoc) SELECT * FROM OPENROWSET (Bulk 'c:\temp\MyXMLDoc.xml', SINGLE_CLOB) as x
در اين مثال، عبارت INSERT براي درج نتايج عبارت SELECT * FROM OPENROWSET در ستون MyXMLDoc
در جدول MyXMLDocs استفاده ميشود. تابع OPENROWSET
از تأمين كننده مجموعه رديف Bulk
براي OPENROWSET براي خواندن داده از فايل 'C:\temp\MyXMLDoc.xml' استفاده ميكند. ميتوانيد محتويات فايل MyXMLDoc.xml را در اين ليست ببينيد:
<MyXMLDoc xmlns="http://MyXMLDocSchema"> <DocumentID>3</DocumentID> <DocumentBody>"The Third Body"</DocumentBody></MyXMLDoc>
اگر اين فرمان را از SQL Server
Management Studio اجرا كنيد، بايد
به خاطر داشته باشيد كه اين فرمان در سيستم SQL Server اجرا خواهد شد و بنابراين مراجع فايل و مسير بايد در سيستم سرور
محلي باشند. آرگومان SINGLE_CLOB
مشخص ميكند كه داده اين فايل، در يك رديف تكي درج خواهد شد. اگر آرگومان SINGLE_CLOB را حذف كنيد، آنگاه داده اين فايل ميتواند در چند رديف درج شود.
بهطور پيشفرض، تأمين كننده Bulk
براي تابع OPENROWSET، رديفها را در كاراكتر Carriage Return
برميگرداند كه حايل رديف پيشفرض است. به روش ديگر، ميتوانيد حايلهاي فيلد و
رديف را با استفاده از آرگومانهاي FIELDTERMINATOR
و ROWREMINATOR تابع OPENROWSET
مشخص كنيد.
ويژگي مرتبط XML جديد ديگر در SQL Server 2005،
پشتيباني HTTP
SOAP طبيعي است. اين
ويژگي جديد به SQL
Server امكان ميدهد تا
مستقيماً به درخواستهاي HTTP SOAP
پاسخ دهد كه توسط سرويسهاي وب بدون نياز به يك سيستم IIS براي عمل كردن به عنوان يك واسطه، صادر شدهاند. با استفاده از
پشتيباني HTTP
SOAP، ميتوانيد سرويسهاي
وبي ايجاد كنيد كه قادر به اجراي دستههاي T-SQL،
رويههاي ذخيره شده و توابع عددي تعريف شده كاربر هستند. براي اطمينان از يك سطح
بالاي امنيت پيشفرض، دستيابي HTTP
طبيعي بهطور پيشفرض غيرفعال ميشود. هرچند ميتوانيد پشتيباني HTTP را براي ايجاد يك نقطه انتهاي HTTP براي اولين بار فعال كنيد. ميتوانيد مثال كدي را براي ايجاد يك
نقطه انتهاي HTTP در اين ليست ببينيد:
CREATE ENDPOINT MyHTTPEndpointSTATE = STARTEDAS HTTP( PATH = '/sql', AUTHENTICATION = (INTEGRATED ), PORTS = ( CLEAR ), SITE = 'server' )FOR SOAP ( WEBMETHOD 'http://tempUri.org/'.'GetProductName' (name='AdventureWorks.dbo.GetProductName', schema=STANDARD ), BATCHES = ENABLED, WSDL = DEFAULT, DATABASE = 'AdventureWorks', NAMESPACE = 'http://AdventureWorks/Products' )
اين مثال، ايجاد يك نقطه انتهاي HTTP به نام MyHTTPEndPoint
را براي رويه ذخيره شدهاي به نام GetProductName
در پايگاه داده AdvantureWorks نمونه تشريح ميكند. هنگامي كه نقطه انتهاي HTTP ايجاد ميشود، ميتواند از طريق يك درخواست SOAP صادر شده توسط يك برنامه، مورد دستيابي قرار گيرد. ميتوانيد از
عبارات ALTER
ENDPOINT DDL و DROP ENDPOINT براي مديريت نقاط انتهاي SQL Server HTTP
استفاده كنيد. نقاط انتهاي HTTP
جديد همچنين رمزگذاري جريان داده را با استفاده از SSL ممكن ميسازند. براي كسب اطلاعات بيشتر در مورد پشتيباني HTTP جديد SQL Server
ميتوانيد به فصل 2 مراجعه كنيد.
اين فرمان نحوه ليست كردن نقاط انتهاي HTTP ايجاد شده را نشان ميدهد:
select * from sys.http_endpoints
در حالي كه اكثر بهبودهاي XML در SQL Server 2005
براي موتور پايگاه داده رابطهاي پيادهسازي شدهاند، Analysis Services همچنين چندين ويژگي مرتبط به XML جديد مهم را دريافت كرده است كه مهمترين آن، XML for Analysis
Services است كه XMLA نيز ناميده ميشود. در اين بخش، مطالب بيشتري درباره ويژگي XML for Analysis
Services جديد ميآموزيد.
XML for Analysis Services يك API
است كه دستيابي داده به منابع داده Analysis Services
را فراهم ميكند كه در وب قرار دارند. XML for Analysis Services بعد از OLE DB
مدلسازي شده است كه يك مدل دستيابي داده جهاني را براي منبع داده چند بعدي فراهم
ميكند. هرچند، برخلاف OLE DB
مبتني بر COM، XML
for Analysis Services
برطبق پروتكل SOAP مبتني بر XML
ساخته شده است. همچنين برخلاف OLE DB
كه بر طبق مدل كلاينت/ سرور ساخته شده است، XML for Analysis
Services براي كاربرد در وب
بهينه شده است.
XML for Analysis Services دو متد قابل دستيابي عمومي را فراهم كرده است: متد Discover و متد Execute.
متد Discover همانگونه كه از نام آن برميآيد، اطلاعاتي درباره يك منبع داده
ميگيرد. متد Discover ميتواند اطلاعاتي درباره منابع داده موجود، تأمين كنندگان منبع
داده و فوق داده موجود ليست كند. متد Execute
به يك برنامه امكان اجراي فرامين را در منابع داده XML for Analysis
Services ميدهد.
SQL Server 2005
اطلاعاتي درباره XML مورد استفاده در سرور را در تعدادي از ديدگاههاي جديد سيستم
ذخيره ميكند. جدول 1-7 بهطور خلاصه ديدگاههاي XML سيستمي جديد را بيان ميكند.
|
ديدگاه
كاتالوگ XML |
شرح |
|
sys.xml_attributes |
اين
ديدگاه، رديفي را براي هر صفت XML
ذخيره شده فراهم ميكند. |
|
sys.xml_components |
اين
ديدگاه، رديفي را براي هر جزء يك طرحواره XML فراهم ميكند. |
|
sys.xml_component_placements |
اين
ديدگاه، رديفي را براي هر جايگزين يك جزء XML فراهم ميكند. |
|
sys.xml_elements |
اين
ديدگاه، رديفي را براي هر جزء XML
كه يك عنصر XML است، فراهم ميكند. |
|
sys.xml_facets |
اين
ديدگاه، رديفي را براي هر محدوديت يك نوع XML فراهم ميكند. |
|
sys.xml_model_groups |
اين
ديدگاه، ليستي از تمام اجزاي XML
فراهم ميكند كه بخشي از يك Model-Group
است. |
|
sys.xml_namespaces |
اين
ديدگاه رديفي براي هر فضاي نام تعريف شده XSD فراهم ميكند. |
|
sys.xml_types |
اين
ديدگاه رديفي براي هر جزء XML
كه يك نوع XML است، فراهم ميكند. |
|
sys.xml_wildcards |
اين
ديدگاه رديفي براي هر جانشين صفت يا عنصر XML فراهم ميكند. |
|
sys.xml_wildcard_namespaces |
اين
ديدگاه رديفي براي هر فضاي نام جانشين XML
فراهم ميكند. |