۱۳۸۷/۱۲/۱۷

دريافت مناسبت‌هاي سال 1388 از يك فايل XML


هميشه با نزديك شدن آخر سال، به روز كردن مناسبت‌هاي تقويم سال بعد ضروري مي‌شود. دوستان لينوكسي ما هم در اين مورد زحمت كشيده و برنامه‌اي را تهيه كرده‌اند كه از آدرس زير قابل دريافت است:
http://download.gna.org/jalali-calendar/

پس از دريافت برنامه، مناسبت‌هاي سال 1388 در فايل 1388.xml قابل مشاهده است (با تقدير و تشكر از زحمات اين عزيزان). فرض كنيد مي‌خواهيم اين اطلاعات را به اس كيوال سرور منتقل كنيم.
فرمت اين فايل به شكل زير است:

<?xml version="1.0" encoding="UTF-8"?>
<cal1388>
<day>
<num>1/1</num>
<desc>عید نوروز، لحظه تحويل سال:ساعت 15 و 13 دقيقه و 39 ثانيه </desc>
</day>
</cal1388>

حداقل سه راه حل براي انجام اينكار (خواندن فايل xml توسط اس كيوال سرور) موجود است:

راه اول:

SELECT '1388' saal,
X.day.query('num').value('.', 'nVARCHAR(50)') rooz_maah,
X.day.query('desc').value('.', 'nVARCHAR(max)') tozih
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('cal1388/day') AS X(day);

راه دوم:

DECLARE @MyXML XML

SELECT @MyXML = CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)

SELECT 1388 saal,
nref.value('num[1]', 'nvarchar(50)') rooz_maah,
nref.value('desc[1]', 'nvarchar(max)') tozih

FROM @MyXML.nodes('//day') AS R(nref)

راه سوم:
DECLARE @MyXML XML
DECLARE @handle INT

SELECT @MyXML = CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)

EXEC sp_xml_preparedocument @handle OUTPUT,
@MyXML

SELECT 1388 saal,
*
FROM OPENXML(@handle, '/cal1388/day', 2) WITH
(num VARCHAR(20), [desc] NVARCHAR(MAX))

EXEC sp_xml_removedocument @handle

اكنون كه مي‌توانيم اطلاعات اين فايل را select كنيم، Insert آن ساده است . براي مثال:
INSERT INTO tblMonasebat
(
saal,
rooz_mah,
tozih
)
SELECT '1388' saal,
nref.value('num[1]', 'nvarchar(50)') rooz_maah,
nref.value('desc[1]', 'nvarchar(max)') tozih
FROM @MyXML.nodes('//day') AS R(nref)

بديهي است امكان مقدار دهي @MyXML به صورت يك رشته كه حاوي محتويات فايل است نيز مهيا مي‌باشد (بجاي خواندن از فايل).

براي مطالعه‌ي بيشتر
XML Support in Microsoft SQL Server 2005
Beginning SQL Server 2005 XML Programming