PDA

View Full Version : آشنایی با XML در SQL Server 2005



Mohandes2009
دوشنبه 03 آبان 1389, 21:04 عصر
استفاده از 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 اشکالهایی به مدل مایکروسافت گرفته اند . برای نمونه این دو لینک را مشاهده کنید ، یک (http://nativexmldatabase.com/2008/09/19/xml-in-sql-server-2005/) و دو (http://nativexmldatabase.com/2008/09/24/xml-in-sql-server-2008/?referer=sphere_related_content/)

ثبت Schema

Schema امکان تعریف مفهوم اطلاعات را به ما می دهد . مثلا ً در schema تعریف می کنیم که اگر مقدار یک گره 5 بود منظور از 5 مقدار عددی است یا رشته (در XML همه چیز به شکل متنی ذخیره می شود ) . با استفاده از schema ، client می تواند تشخیص دهد که برای یک گره خاص چه کاری باید انجام دهد . برای اطلاعات بیشتر در مورد schema به http://www.w3.org/TR/xml-infoset/ مراجعه کنید . در SQL Server 2005 انباره ای مشخص برای schema ها قرار دارد . برای اضافه کردن Schema از دستور Create XML Schema به روش زیر استفاده می کنیم .



createxmlschemacollection HamedSchema3 as
'<xs:schema targetNamespace="HamedSchema3" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="MySpecs">
<xs:complexType>
<xs:sequence>
<xs:element name="Spec1" type="xs:string" />
<xs:element name="Spec2" type="xs:string" />
<xs:element name="Spec3" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'

Schema ایجاد شده را می توان در Management Studio مشاهده کرد :


http://hamedb.com/logfiles/sql_xml/xml_schema.png

برای حذف schema از دستور drop xml schema و برای ویرایش آن از alter استفاده می شود . البته برای alter محدودیت هایی وجود دارد که در اینجا (http://msdn.microsoft.com/en-us/library/ms189778(SQL.90).aspx) می توانید مشاهده کنید .

نوع داده 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))


http://hamedb.com/logfiles/sql_xml/table.png

حالا اطلاعات ذخیره شده در جدول به اجزایی که در schema تعریف شده است تجزیه می شوند . با این روش که خود SQL Server آن را انجام می دهد سرعت ذخیره و بازیابی اطلاعات بیشتر می شود .


افزودن سطر جدید به جدول

برای درج سطر جدید به جدول از دستور Insert استفاده می شود با این نکته که در مقدار ستونی که XML است می بایست یک مقدار well formed قرارداد . اگر ستون از schema ی مشخصی استفاده بکند می بایست مقدار آن ستون نیز از آن schema پیروی کند .




insertinto testxml2 (title,xmlcolumn)
values('monitor',
'<x:MySpecs xmlns:x="HamedSchema3">
<Spec1>lcd 1</Spec1>
<Spec2>wide</Spec2>
<Spec3>Sony</Spec3>
</x:MySpecs>
'
)
select*from testxml2






http://hamedb.com/logfiles/sql_xml/xml_query_001.png


پرس و جو از بانک

برای دریافت اطلاعات از بانک روش های مختلفی وجود دارد . روش ساده تر این است که مثل یک نوع داده دیگر مانند 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



خروجی دستور فوق عبارتی مانند زیر است

<name>hamed</name>

اگر از تابع 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 <mynode>salam</mynode> as first into (/root)[1] ')



تغییر مقدار یک گره :




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 می توان انجام داد آشنا شویم . در آینده در مورد هر یک موارد فوق مطالب مفصلی خواهم نوشت .و همراه با یک پروژه عملی(البته اگه نظرتون را اینجا بنویسید) دوستان گلم منتظر باشید!


منبع : کلیکــ کنید. (http://eshgheman.blogfa.com/)