استفاده از XML يکی از راه های به اشتراک گذاشتن ، ذخيره و انتقال اطلاعات است . مثلا ً در وب سرويس ها برای انتقال اطلاعات از XML استفاده می شود . بسياری از نرم افزارها بخش يا تمامی اطلاعاتشان را به شکل XML ذخيره و بازيابی می کنند . يکی از مسائلی که هميشه کار با XML را در حجم زياد دچار مشکل می گرده بهينه نبودن جستجو و ذخيره تغييرات در آن بوده است . فايل XML يک نوع فايل متنی است ، مانند يک text فايل ساده . اين برای نرم افزارهايی که تک کاربر و در يک ماشين اجرا می شود مشکل خاصی ايجاد نمی کند اما در محيط شبکه و client server مفيد نيست .
SQL Server به عنوان يک نرم افزار برای ذخيره اطلاعات در سطح سازمان ها ، در نسخه 2005خود امکان پشتيبانی از نوع داده XML دارد و برای کا ربا XML از DMLهای استاندارد جهانی و آنهايی که مايکروسافت برايش ساخته است استفاده می کند . استفاده از SQL Server 2005 و DML های مربوط به کار با XML باعث افزايش سرعت و کارايی نرم افزارهايی می شود که می خواهند در حجم های زياد از XML استفاده کنند .
امکاناتی که SQL Server 2005 به ما برای کار با XML می دهد عبارتند از :
1. Data Type جديد با نام XML برای ذخيره XML
2. امکان ثبت Schema برای XML ، بررسی اعتبار اطلاعاتی که اضافه می کنيم با schema
3. تجزيه خودکار گره های XML برای index کردن و ذخيره آنها در يک جدول که البته در دسترس ما نيست
4. استفاده از XQuery و XML-DML برای کار با اطلاعات
البته شرکتهای ديگر مثل IBM اشکالهايی به مدل مايکروسافت گرفته اند . برای نمونه اين دو لينک را مشاهده کنيد ، يک و دو
ثبت Schema
Schema امکان تعريف مفهوم اطلاعات را به ما می دهد . مثلا ً در schema تعريف می کنيم که اگر مقدار يک گره 5 بود منظور از 5 مقدار عددی است يا رشته (در XML همه چيز به شکل متنی ذخيره می شود ) . با استفاده از schema ، client می تواند تشخيص دهد که برای يک گره خاص چه کاری بايد انجام دهد . برای اطلاعات بيشتر در مورد schema به http://www.w3.org/TR/xml-infoset مراجعه کنيد . در SQL Server 2005 انباره ای مشخص برای schema ها قرار دارد . برای اضافه کردن Schema از دستور Create XML Schema به روش زير استفاده می کنيم .
| بخش کد |
| create xml schema collection HamedSchema3 as ' |
Schema ايجاد شده را می توان در Management Studio مشاهده کرد :

برای حذف schema از دستور drop xml schema و برای ويرايش آن از alter استفاده می شود . البته برای alter محدوديت هايی وجود دارد که در اينجا می توانيد مشاهده کنيد .
نوع داده XML
از نوع داده جديد ، XML ، مانند بقيه انواع داده ها می توان استفاده کرد . در تعريف نوع ستون ، در Stored Procedure ها و هر جای ديگری که از int و nvarchar استفاده می شود . در اين نوع داده ، هر XML ی که well formed باشد می تواند ذخيره شود چه يک document کامل باشد ، چه بخشی از آن . ولی well formed بودن اجباری است .
مقادير XML ی که در ستونی از نوع XML قرار می گيرند می توانند Typed باشند يا un-Typed . Typed زمانی است که برای مقدار يا کل ستون (هنگام تعريف) از يک schema ی که قبلا ً تعريف شده است نيز نام برده شود . مثلاً هنگام تعريف ستون ذکر شود که مقدار داخل اين ستون حتماً می بايست توسط HamedSchema3 بررسی شوند . مانند :
| بخش کد |
| Create table HamedTable ( id int ,title nvarchar(30), xmlcolumn xml ( hamedschema3)) |

حالا اطلاعات ذخيره شده در جدول به اجزايی که در schema تعريف شده است تجزيه می شوند . با اين روش که خود SQL Server آن را انجام می دهد سرعت ذخيره و بازيابی اطلاعات بيشتر می شود .
افزودن سطر جديد به جدول
برای درج سطر جديد به جدول از دستور Insert استفاده می شود با اين نکته که در مقدار ستونی که XML است می بايست يک مقدار well formed قرارداد . اگر ستون از schema ی مشخصی استفاده بکند می بايست مقدار آن ستون نيز از آن schema پيروی کند .
| بخش کد |
| insert into testxml2 (title,xmlcolumn) values ('monitor' , ' ' ) select * from testxml2 |

پرس و جو از بانک
برای دريافت اطلاعات از بانک روش های مختلفی وجود دارد . روش ساده تر اين است که مثل يک نوع داده ديگر مانند int مقدار ستون XML را بخوانيم . اين روش مانند اين است که اصلاً نوع داده ی XML نداشته باشيم و بخواهيم بوسيله Parser ها اطلاعات موجود در ستون را بازيابی کنيم . روش ديگر استفاده XQuery و XML-DML است .
XQuery و XML-DML
XML Query يا XQuery به منظور پرس و جو در XML ابداع شده است . XQuery ترکيب XPath و مفاهيمی است که کسانی که با SQL کار کرده اند با آن آشنا باشند . اطلاعات تکميلی درباره XQuery در اينجا است . http://www.w3.org/XML/Query/ برای مثال
| بخش کد |
| doc(“filename.xml”)/root/item[@id=”2”]/name |
تابع doc ، document موجود در filename را باز کرده و نام آيتمی را که شماره آن 2 است را بر می گرداند . SQL Server 2005 تعدادی از دستورات XQuery که پر استفاده هستند را پشتيبانی می کند .
در XML Data Manipulation Language يا XML-DML توابعی مانند query ، exist و modify وجود دارد که بوسيله آنها می توان بدون اينکه کل يک document را خواند به يک گره از آن دسترسی پيدا کرد يا آن را ويرايش نمود .
استفاده از query
مثالی که برای XQuery آورده شده بود در خط زير بوسيله به شکلی ديگر آورده شده است :
| بخش کد |
| Select myXMLField.query(‘/root/item[@id=”2”]/name’) from mytable |
خروجی دستور فوق عبارتی مانند زير است
| بخش کد |
اگر از تابع data استفاده شود فقط مقدار گره برگردانده می شود :
| بخش کد |
| Select myXMLField.query( ‘data(/root/item[@id=”2”]/name)’) from mytable |
اگر اين پرس و جوها برای يک ستون داری schema باشد ، می توان schemaی آن را مشخص شود .
| بخش کد |
| select xmlcolumn.query('declare namespace s = "HamedSchema3" ; /s:MySpecs/Spec1') from HamedTable |
البته استفاده از مدل typed سريعتر از حالت untyped است .
استفاده از exist
اگر پارامتری که در exist مشخص می شود وجود داشته باشد مقدار true و اگر نباشد false بر می گرداند .
| بخش کد |
| select title from testxml2 where xmlcolumn.exist('declare namespace s="HamedSchema3" ; /s:MySpecs[Spec1="lcd 1"]') = 1 |
استفاده از modify
از modify برای تغيير در مقدار ستون xml استفاده می شود . اين تابع 3 نوع عمليات انجام می دهد . افزودن گره جديد ، حذف يک گره و جايگزين کردن مقدار يک گره .
حذف تمامی nodename ها از جدول :
| بخش کد |
| update tablename set fieldname.modify('delete //nodename) |
افزودن يک گره جديد :
| بخش کد |
| update tablename set fieldname.modify('insert |
تغيير مقدار يک گره :
| بخش کد |
| update HamedTable2 set xmlcolumn.modify('replace value of (//Spec1)[1] with "LCD"') where xmlcolumn.exist('declare namespace s="HamedSchema3" ; /s:MySpecs[Spec1="lcd 1"]') = 1 |
در اين متن سعی شد به شکل بسيار مختصر با نوع داده XML و کارهايی که روی آن در SQL Server 2005 می توان انجام داد آشنا شويم .
پیوند ها