فصل هفتم

 

يكپارچگي 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 طبيعي

بدون شك، مهم‌ترين بهبود مربوط به 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 معتبر است. هرچند، مايكروسافت نوع داده 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 AS
N'<?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 1
XML Validation: Invalid content,expected
element(s):MyXMLDocSchema:DocumentID where element 'MyXMLDocSchema:Do' was
specified

 

توجه: همان‌گونه كه ممكن است از رابطه وابسته آن‌ها انتظار داشته باشيد، اگر طرح‌واره‌اي را به ستوني در جدول نسبت دهيد، آن جدول بايد قبل از بهنگام‌رساني تعريف طرح واره، تغيير كند يا حذف شود.

 

بازيابي يك طرح‌واره 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         1
65540                                     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/XMLSchema
targetNamespace="http://MyXMLDocSchema" xmlns:t=http://MyXMLDocSchema
elementFormDefault="qualified"><xsd:elementname="MyXMLDoc">
<xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:any
 
(1 row(s) affected)

 

صفت elementname ستون‌هايي را فهرست مي‌كند كه از نوع داده XML نوع‌دار استفاده مي‌كنند.

 

متدهاي نوع داده XML

SQL Server 2005 چندين متد تعبيه شده جديد را فراهم كرده است كه بسيار شبيه انواع تعريف شده كاربر براي كار كردن با نوع داده XML كار مي‌كند. اين متدها به شما امكان مي‌دهند تا با استفاده از نوع داده XML به‌طور عمقي به محتويات XML ذخيره شده وارد شويد. براي تسهيل كردن يكپارچگي عمقي، نياز به روشي براي پرس‌وجو و دستكاري داده ذخيره شده با استفاده از نوع داده XML جديد داريد و اين كه چه چيزي متدهاي نوع داده XML را فعال مي‌كند.

 

Exists (XQuery, [node ref]

متد Exists نوع داده XML به شما امكان مي‌دهد تا محتويات يك سند XML را براي وجود عناصر يا صفات استفاده كننده از يك عبارت XQuery بررسي كنيد (مطالب بيشتر درباره زبان XQuery در بخش بعد ارايه مي‌شود). اين ليست نحوه استفاده از متد Exists نوع داده XML را نشان مي‌دهد:

SELECT * FROM MyXMLDocs
WHERE 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 MyXMLDocs
SET 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 Body
FROM 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 ID
FROM MyXMLDocs

 

برخلاف متدهاي ديگر نوع داده XML، متد XML Value نياز به دو پارامتر دارد. اولين پارامتر يك عبارت XQuery است و دومين پارامتر، نوع داده SQL را مشخص مي‌كند كه مقدار عددي برگردانده شونده از متد Value است. اين مثال تمام مقادير موجود در عنصر DocumentID را برمي‌گرداند و آن‌ها را به نوع داده int تبديل مي‌كند، همان‌گونه كه در اين نتايج نشان داده شده است:

ID
-----------
1
2
 
(2 row(s) affected)

 

پشتيباني XQuery

در بخش قبل، نحوه استفاده از 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

نوع داده XML از حداكثر 2GB پشتيباني مي‌كند كه بسيار بزرگ است. اندازه داده XML و كاربرد آن مي‌تواند تأثير بزرگي بر كارآيي حاصله سيستم داشته باشد، در حالي كه داده XML را پرس‌وجو مي‌كنيد. براي بهبود كارآيي پرس‌وجوهاي XML، SQL Server 2005 توانايي ايجاد ايندكس‌ها روي ستون‌هايي را كه داراي نوع داده XML هستند، فراهم كرده است.

ايندكس‌هاي 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 ثانويه

علاوه بر ايندكس اصلي، هم‌چنين مي‌توانيد ايندكس‌هاي XML ثانويه را بسازيد. ايندكس‌هاي ثانويه روي يكي از اين صفات سند ساخته مي‌شوند:

ü        Path: مسير سند كه براي ساخت ايندكس استفاده مي‌شود.

ü        Value: مقادير سند كه براي ساخت ايندكس استفاده مي‌شود.

ü        Property: خصوصيات اسناد براي ساخت ايندكس استفاده مي‌شوند.

ايندكس‌هاي ثانويه هميشه به همان روش ايندكس XML اصلي پارتيشن‌بندي مي‌شوند. اين ليست، ايجاد يك ايندكس XML مسير ثانويه را نشان مي‌دهد:

 

CREATE XML INDEX My2ndXMLDocsIdx ON MyXMLDocs(MyXMLDoc)
 USING XML INDEX MyXMLDocsIdx FOR PATH

 

بهبودهاي FOR XML

بخش FOR XML ابتدا براي عبارت T-SQL SELECT در SQL Server 2000 معرفي شد. اين بخش در SQL Server 2005 بهبود يافته است. برخي از قابليت‌هاي جديدي كه در پشتيباني FOR XML در SQL Server 2005 پيدا مي‌شود، شامل پشتيباني براي نوع داده XML، انواع داده تعريف شده كاربر، نوع داده timestamp و پشتيباني بهبود يافته براي داده رشته‌اي است. علاوه بر اين، بهبودهاي FOR XML هم‌چنين شامل پشتيباني براي يك رهنمود Type جديد، پرس‌وجوهاي FOR XML تودرتو و توليد طرح واره XSD درون برنامه‌اي است.

 

رهنمود Type

هنگامي كه انواع داده 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 را به عنوان يك جريان متوالي برمي‌گرداند. من فرمت‌بندي را به ليست قبل اضافه كرده‌ام تا خواناتر شود.

پرس‌وجوهاي FOR 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>&quot;My text&quot;</DocumentBody>
    </MyXMLDoc>
  </MyXMLDoc>
</MyXMLDocs>

 

توجه: فرمت‌بندي را براي خواناتر شدن به ليست قبل اضافه كرده‌ام.

 

توليد طرح واره XSD درون برنامه‌اي

ويژگي جديد ديگر در پشتيباني 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 توليد كنيد.

 

بهبودهاي OPENXML

بخش 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 ببينيد.

 

شكل 1-7 مروري از OPENXML

 

در SQL Server 2005، پشتيباني OPENXML توسعه يافته است تا پشتيباني از نوع داده XML جديد و نوع داده تعريف شده كاربر جديد را داشته باشيم. مثال زير نحوه استفاده از OPENXML را در الحاق با يك بخش WITH در الحاق با نوع داده XML جديد نشان مي‌دهد:

 

DECLARE @hdocument int
DECLARE @doc varchar(1000)
SET @doc ='<MyXMLDoc>
      <DocumentID>1</DocumentID>
      <DocumentBody>"OPENXML Example"</DocumentBody>
    </MyXMLDoc>'
EXEC sp_xml_preparedocument @hdocument OUTPUT, @doc
SELECT * 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 اين كار را بسيار ساده كرده است. اين ويژگي يك مكانيزم بسيار سريع براي بارگذاري اسناد 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 مشخص كنيد.

 

دستيابي HTTP SOAP طبيعي

ويژگي مرتبط XML جديد ديگر در SQL Server 2005، پشتيباني HTTP SOAP طبيعي است. اين ويژگي جديد به SQL Server امكان مي‌دهد تا مستقيماً به درخواست‌هاي HTTP SOAP پاسخ دهد كه توسط سرويس‌هاي وب بدون نياز به يك سيستم IIS براي عمل كردن به عنوان يك واسطه، صادر شده‌اند. با استفاده از پشتيباني HTTP SOAP، مي‌توانيد سرويس‌هاي وبي ايجاد كنيد كه قادر به اجراي دسته‌هاي T-SQL، رويه‌هاي ذخيره شده و توابع عددي تعريف شده كاربر هستند. براي اطمينان از يك سطح بالاي امنيت پيش‌فرض، دستيابي HTTP طبيعي به‌طور پيش‌فرض غيرفعال مي‌شود. هرچند مي‌توانيد پشتيباني HTTP را براي ايجاد يك نقطه انتهاي HTTP براي اولين بار فعال كنيد. مي‌توانيد مثال كدي را براي ايجاد يك نقطه انتهاي HTTP در اين ليست ببينيد:

CREATE ENDPOINT MyHTTPEndpoint
STATE = STARTED
AS 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 براي Analysis Server

در حالي كه اكثر بهبودهاي XML در SQL Server 2005 براي موتور پايگاه داده رابطه‌اي پياده‌سازي شده‌اند، Analysis Services هم‌چنين چندين ويژگي مرتبط به XML جديد مهم را دريافت كرده است كه مهم‌ترين آن، XML for Analysis Services است كه XMLA نيز ناميده مي‌شود. در اين بخش، مطالب بيشتري درباره ويژگي XML for Analysis Services جديد مي‌آموزيد.

 

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 مي‌دهد.

 

ديدگاه‌هاي كاتالوگ XML سيستم

SQL Server 2005 اطلاعاتي درباره XML مورد استفاده در سرور را در تعدادي از ديدگاه‌هاي جديد سيستم ذخيره مي‌كند. جدول 1-7 به‌طور خلاصه ديدگاه‌هاي XML سيستمي جديد را بيان مي‌كند.

 

جدول 1-7 ديدگاه‌هاي كاتالوگ SQL Server 2005 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 فراهم مي‌كند.

 



[1]- eXtensible Markup Language

[2]- Simple Object Access Protocol

[3]- Extensible Schema Definition

[4]- XML Data Reduced

[5]- Document Object Model