PDA

View Full Version : OPENXML



titbasoft
یک شنبه 14 فروردین 1384, 13:08 عصر
چون خودم حالشو بردم گفتم شاید بد نباشه برای همه بگم.
با استفاده از دستور OPENXML می تونید فایل های (رشته ها) با فرمت XML رو به قولی parse کرد. این روش به این درد میخوره که اگر مثلا یکسری دیتا با فرمت های مختلف هر روز به یک data center برسه فقط کافیه به راحتی به فرمت XML تبدیل بشه و ازش query گرفته بشه کاملا مثل یک جدول.
مثال:

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))

با استفاده از sp_xml_preparedocument یک هندل برای رشته خود بدست آورید(idoc@)
با استفاده از sp_xml_removedocument هندل را آزاد کنید

EXEC sp_xml_removedocument @idoc
دقت کنید که نام فیلد ها case sensitive هستند
:wink: :flower:

AminSobati
یک شنبه 14 فروردین 1384, 19:18 عصر
:D
و در تکمیلش اینکه با ترکیب این دستور با Insert، میتوان اطلاعات رو از سند XML به جدول انتقال داد:

INSERT MyTable SELECT * FROM OPENXML...

با تشکر از titbasoft عزیز!

titbasoft
سه شنبه 16 فروردین 1384, 18:17 عصر
یه چیز جالبه دیگه: :kaf:
اگر به اخر هر select statement تون این جمله رو اضافه کنید FOR XML AUTO با اجازتون query شما به فرمت xml در میاد. فقط می تونم بگم فوق العاده است مخصوصا وقتی دارید join می بندید نتایج خیلی جالبی می گیرید. مثال:

Select t1.t1ID , t2.t2ID
FROM t1 JOIN t2 ON t1.t1ID=t2.t2ID
FOR XML AUTO
فقط یه چیز برام عجیبه اونهم اینکه چرا سرعتش اینقدر بالا است :گیج: شاید با سرعت یک query معمولی چندان فرقی نکنه. من روی 110000 تا رکورد تست کردم. تازه execution plan اونهم کاملا مشابه یک query ساده است یعنی ظاهرا کار اضافه ای هم انجام نمیشه :strange:

AminSobati
چهارشنبه 17 فروردین 1384, 00:14 صبح
عبارت FOR XML به نوعی اولین برخورد SQL Server با دنیای XML است که در نسخه 2005 شاهد امکاناتی به مراتب جالب تر هم خواهیم بود. حتی یک جنس جدید به نام XML وجود داره که برای ذخیره اطلاعات XML نیازی به varchar نداریم و جالب تر اینکه روی Elementها و Valueها میتونین Index بسازین تا سرعت جستجو روی سند XML بسیار افزایش پیدا میکنه. SQL Server 2000 قادر نیست XSD تولید کنه ولی 2005 قراره که بتونه!
به علاوه بسیاری قابلیتهای مهیج دیگه در دنیای XML!

titbasoft
پنج شنبه 18 فروردین 1384, 09:08 صبح
FOR XML محدودیت داره ؟ من از یک جدول بزرگ که query گرفتم 40 تا رکورد برگردوند آخریش با یک element نصفه تموم شد مثل:

<bibtexts BibID="322" Bib تازه نصف دیتاهای جدولم رو هم بیشتر جمع نکرد

AminSobati
پنج شنبه 18 فروردین 1384, 11:33 صبح
نه دوست عزیزم،
SQL Server محدودیت نداره بلکه این QA هست که نمایش رو Truncate میکنه. برای اینکه بتونین طول بیشتری از اطلاعات رو ببینین، در QA به این منو وارد بشین:
Tools > Options > Results
و مقدار Maximum Characters رو به 8000 تغییر بدین. مجددا Query بگیرین...
اگر بازهم پهنای ستون بیشتر از 8000 کاراکتر بود، بهترین کار اینه که یا Result رو به VB بدین تا در Textbox نمایش بده یا اینکه Result رو توسط BCP وارد یک Text File کنین و با Notepad مشاهده کنین.
موفق باشید..

titbasoft
پنج شنبه 18 فروردین 1384, 12:35 عصر
مرسی از توجهتون :flower:

بهترین کار اینه که یا Result رو به VB بدین تا در Textbox نمایش بدهمن دقیقا همین کار رو کردم . وقتی command ام رو execute کردم یه exception سیستمی گرفتم. دقیقا commandtext ام رو به textbox منتقل کردم اون رو کپی کردم توی QA و اونجا execute کردمش. پیامی گرفتم مبنی بر اینکه در parse کردن مشکلی وجود داره. با دقت که نگاه کردم دیدم همون اتفاقی که عرض کردم افتاده. فکر کنم باید با دقت بیشتری بررسی کنم شاید مشکل در خوندن دیتاها باشه. ولی خیلی عجیبه. نتیجه رو خدمتتون عرض می کنم

titbasoft
پنج شنبه 18 فروردین 1384, 21:31 عصر
ببخشید دیر شد. آخه بیرون بودم.
همون موقع کل result set ام رو توی یک string ذخیره کردم و element هام رو split کردم درست شد. فکر کنم بازم یه جائی سوتی داده بودم :mrgreen:
بازم مرسی :wink:

AminSobati
جمعه 19 فروردین 1384, 00:39 صبح
موفق باشین :)