הבלוג של גרי רשף

03/06/2010

שימוש ב-XML

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 13:55

פגשתי מישהי בכנס SQL Server & BI השבוע, ובין לבין מילמלתי משהו על כך שיש הרבה דברים שאינני יודע. היא קצת הופתעה כי ממה שמתפרסם בבלוג היא סברה שיש לה עסק עם מומחה רב מעללים שכדרכם של גדולי הדור יכול להרשות לעצמו להצטנע ולהפחית מערכו, אלא שהאמת היא שחלק גדול ממה שאני כותב מתבסס על נסיונות שאני עורך עם טכנולוגיות חדשות ולא מוכרות עבורי: קורא פה ושם, מנסה, וכשאני מצליח- רץ לספר לחבר'ה ומשתדל לכתוב אותו פוסט שהייתי רוצה למצוא כשאני עצמי חיפשתי חומר על הנושא – עם הוראות הפעלה מדוייקות ומינימליסטיות.
אם להיתלות באילנות גבוהים- אני שואב השראה מהבלוג של Pinalkumar Dave שהוא גם MVP וגם כותב פוסטים עם הסברים טכניים מאירי עיניים שגם אני מבין..
כל ההקדמה הזו באה כדי להנמיך ציפיות- זו ההתנסות המסודרת הראשונה שלי עם XML, אני מסכם את מה שהצלחתי לעשות, ובהמשך אראה מה עוד ניתן ללמוד ואילו אופציות נוספות קיימות.

XML הוא דטבייס תקני (סטנדרטי) שיכול לכלול החל מנתון בודד, דרך רשומה, טבלה, ועד אוסף טבלאות; כאשר בניגוד ל-SQL Server או אוראקל או כל דטבייס רלציוני אחר – מדובר בתקן שאינו משוייך לטכנולוגיה זו או אחרת, בערך כמו קובץ Ascii שהוא דרך מקובלת להעביר נתונים ממערכת אחת לשניה, ואנחנו מצפים שכל מערכת תדע לייצא נתונים לקבצי Ascii ולקלוט נתונים מקבצי Ascii.
ב-SQL Server יש משתנה מסוג XML וניתן לשמור איפוא XML-ים במשתנים או בעמודות (בטבלאות) מסוג XML.

ניצור טבלה ונכניס לתוכה רשומה אחת, הכוללת XML של ארבע שורות מטבלה קיימת (ה-XML הוא בעצם טבלה קטנה):

Use tempdb;

Go

If Object_Id('T_Products') Is Not Null Drop Table T_Products;

Go

Create Table T_Products(ID Int Identity,

                        S XML);

Go

Declare    @S XML;

Set        @S=(Select    ProductID,

                Name,

                ProductNumber

        From    AdventureWorks.Production.Product

        Where    ProductID<=4

        For XML Raw('Products'), Root('Root'))

Insert Into T_Products

Select    @S;

Go

ה-XML עצמו נראה כרגע בערך כך:

<Root>

<Products ProductID="1" Name="Adjustable Race" ProductNumber="AR-5381" />

<Products ProductID="2" Name="Bearing Ball" ProductNumber="BA-8327" />

<Products ProductID="3" Name="BB Ball Bearing" ProductNumber="BE-2349" />

<Products ProductID="4" Name="Headset Ball Bearings" ProductNumber="BE-2908" />

</Root>

את רשימת העמודות ב-XML – ה-Metadata – נוכל כעת לשלוף כך:

DECLARE @DH int,

        @S XML=(Select S From T_Products Where ID=1);

EXEC sp_xml_preparedocument @DH OUTPUT, @S

SELECT Distinct localname

FROM OPENXML(@DH, '//Products') Where nodetype=2

יש לשים לב שה-XML הוא Case Sesitive.

את תכולת ה-XML נוכל לשלוף כך (מתוך משתנה המכיל את ה-XML):

DECLARE @DH int,

        @S XML=(Select S From T_Products Where ID=1);

EXEC sp_xml_preparedocument @DH OUTPUT, @S

SELECT *

FROM OPENXML(@DH, '//Products')

            WITH (ProductID varchar(100),

                Name  varchar(100),

                ProductNumber varchar(100));

ואפשר גם ישירות מתוך הטבלה:

Select    T2.Loc.query('.').value('(/Products/@ProductID)[1]','int') ProductId,

        T2.Loc.query('.').value('(/Products/@Name)[1]','Varchar(Max)') Name,

        T2.Loc.query('.').value('(/Products/@ProductNumber)[1]','Varchar(Max)') ProductNumber

From    T_Products T

Cross Apply S.nodes('/Root/Products') as T2(Loc)

Where    T.ID=1

ניתן לעדכן ערכים בתוך ה-XML. למשל, שינוי ה-ProductNumber בשורה השלישית ל-My new number:

UPDATE    T_Products

SET        S.modify('replace value of (/Root/Products/@ProductNumber)[3] with "My new number"')

Where    ID=1;

כדאי לוודא באמצעות השליפה של ה-XML מתוך הטבלה שהערך אמנם התעדכן.

ניתן להוסיף שורות ל-XML בתחילתו או בסופו:

UPDATE    T_Products

SET        S.modify('insert <Products ProductID="0" Name="First one" ProductNumber="Zero" /> as first into (/Root)[1]')

Where    ID=1;

GO

UPDATE    T_Products

SET        S.modify('insert <Products ProductID="5" Name="Last one" ProductNumber="Five" /> as last into (/Root)[1]')

Where    ID=1;

GO

ולבסוף ניתן כמובן למחוק שורות מה-XML (למשל- השורה השניה):

UPDATE    T_Products

SET        S.modify('delete (/Root/Products)[2]')

Where    ID=1;

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: