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

01/12/2010

With Result Sets: פרדיקאט חדש ב-Denali

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 21:08

מהגרסה הבאה נוכל לעצב את ה-Result Sets המוחזרים על ידי הפרוצדורות בעזרת פקודה מתאימה!

(סימן הקריאה נכתב בציניות כי ההתרשמות שלי היא פיהוק אחד גדול)

ניקח פרוצדורה פשוטה לדוגמה:

Exec sp_databases

With Result Sets(([Database_name] Varchar(Max) Not Null,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

זה הסינטקס והפלט עם הפרדיקאט או בלעדיו זהה.

ננסה לבחון את יכולותיו ומגבלותיו:

1. מה יקרה אם נבחר לעמודה הראשונה סוג טקסט קטן מדי?

Exec sp_databases

With Result Sets(([Database_name] Varchar(10) Not Null,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

התחלה יפה- הפרדיקאט מקטין את הטקסט לגדול הנדרש.

אם היינו מנסים לעשות זאת באופן לא מפורש – למשל להכניס את פלט הפרוצדורה לטבלה עם עמודת טקסט צרה מדי – היינו מקבלים שגיאה.

2. מה יקרה אם נבחר לעמודה השניה – עמודת ה-Integer – סוג נתון קטן מדי?

Exec sp_databases

With Result Sets(([Database_name] Varchar(Max) Not Null,

                [Database_Size] SmallInt Not Null,

                [Remarks] Varchar(Max) Null));

כצפוי קיבלנו שגיאה, אבל אם ננסה לשנות באופן הגיוני (למשל ל-Float) לא צפויה בעייה.

3. מה יקרה אם נגדיר את העמודה השלישית כ-Not Null למרות שיש בה ערכי Null?

Exec sp_databases

With Result Sets(([Database_name] Varchar(Max) Not Null,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Not Null));

כצפוי או שלא כצפוי – קיבלנו שגיאה. תהיתי אם המערכת תדע לספק לי ברירת מחדל מחרוזת ריקה במקרה זה..

4. מה יקרה אם נגדיר את העמודה הראשונה כ-PK (שמות הדטבייסים הם יחודיים)?

Exec sp_databases

With Result Sets(([Database_name] Varchar(Max) Primary Key,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

שגיאה: הפרדיקאט אינו אמור לבדוק יחודיות.

5. מה יקרה עם נשנה את ה-Collation של העמודה הראשונה?

Exec sp_databases

With Result Sets(([Database_name] Varchar(Max) Collate Hebrew_CS_AS,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

יפה מאוד- המשימה הצליחה, אם כי שינוי Collation מתבצע באופן אוטומטי גם אם מפנים את הפלט לטבלה.

לפני הסעיף הבא אתנחתא קומית: לפני מספר ימים התפרסם פוסט של בלוגר באתר די נחשב על הנושא הזה, והבלוגר הכריז בחגיגיות שכעת נוכל לבחור בעזרת הפרדיקאט החדש אילו עמודות להציג ואילו לא ואני ישר הרהרתי לעצמי שלאור העובדה שב-Denali ישנו את המבנה של כל מיני פרוצדורות וטבלאות מערכת- הפרדיקאט הזה יכול למנוע שגיאות על ידי כך שנפלטר מהפלט את העמודות החדשות שלא ציפינו לקבל.. עוד אני שקוע בשרעפים ומה אני מגלה- מה שהבלוגר כתב שגוי, ולא ניתן לעשות זאת; ומספר גולשים העירו לו על כך. תגובתו של הבלוגר הייתה מתנצלת- הוא טרם הוריד את הגרסה החדשה, ורק קרא על ה-feature החדש (מה שלא הפריע לו לפרסם קטעי קוד שגויים לדוגמה).

מספרים על הישראלים שהם גומרים ורצים לספר לחבר'ה, אז מסתבר שיש כאלה שרצים לספר עוד בטרם הורידו את המכנסיים (או את גרסת ה-ctp)..

  1. הצגה של חלק מהעמודות:
Exec sp_databases

With Result Sets((--[Database_name] Varchar(Max) Collate database_default,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

כאמור- שגיאה..

  1. מה יקרה אם נשנה את שם העמודה?
Exec sp_databases

With Result Sets(([DB_name] Varchar(Max) Collate database_default,

                [Database_Size] Int Not Null,

                [Remarks] Varchar(Max) Null));

יפה מאוד- עמודה database_name הפכה ל-DB_name, אם כי גם בהפניית הפלט לטבלה – לא צפויה בעייה במקרה של אי התאמה בין שמות העמודות.

ולסיום- הפרדיקאט מסוגל לטפל גם בפרוצדורות המחזירות מספר סטים, וזו הסיבה לסוגריים הכפולים. למשל:

Exec sp_SpaceUsed

With Result Sets((Database_name Varchar(Max),

                database_size Varchar(Max),

                unallocated_space Varchar(Max)),

                (reserved Varchar(Max),

                data Varchar(Max),

                index_size Varchar(Max),

                unused Varchar(Max)));

לסיכום- אם ברשימת החידושים ב-TSQL הנ"ל מופיע במקום בולט – כנראה שאין הרבה חידושים..

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

4 תגובות »

  1. […] With Result Sets הוא אופרטור חדש בגרסת 2012 שנועד להגדיר במפורש ולעצב את סט התוצאות שפרוצדורה מחזירה. השתמשתי בו כך (תוך שאני מגביל מראש את ערכי העמודות): Select * From OPENROWSET ('SQLNCLI','Server=(Local);Trusted_Connection=Yes','Set FmtOnly OffExec SP_ExecuteSQL N''Declare @SQL NVarchar(Max);Select @SQL=Isnull(@SQL+'''',''''+Char(13)+Char(9)+Char(9),'''''''')+''''Count(Case When type_desc=''''''''''''+type_desc+'''''''''''' Then 1 End) As [''''+type_desc+'''']''''From sys.objectsWhere type_desc In (''''System_Table'''',''''View'''')Group By type_desc;Select @SQL=''''Select Schema_id,''''+Char(13)+ Char(9)+Char(9)+@SQL+Char(13)+ ''''From sys.objects''''+Char(13)+ ''''Group By Schema_id;'''';Exec SP_ExecuteSQL @SQLWith Result Sets(([Schema_id] Int Not Null, [System_Table] Int Not Null, [View] Int Not Null));'';'); […]

    פינגבאק של פתרון לבעיית ה-Pivot הדינאמי (2) - גרי רשף — 09/01/2012 @ 20:15

  2. […] With Result Sets הוא אופרטור חדש בגרסת 2012 שנועד להגדיר במפורש ולעצב את סט התוצאות שפרוצדורה מחזירה. […]

    פינגבאק של פתרון לבעיית ה-Pivot הדינאמי (2) « הבלוג של גרי רשף — 01/01/2012 @ 21:27

  3. הי גרי,

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

    נתראה,
    אלה

    תגובה של אלה משיח — 02/12/2010 @ 10:24

    • תודה גם לך על התגובה.. 🙂
      שיחקתי אתמול עם ההגדרות שם וגם אני אינני מצליח להיכנס לבלוג.
      שלחתי מייל לאחראי על הבלוגים (רון כספית?) ואני מקווה שהוא יושיע אותי.

      תגובה של גרי רשף — 02/12/2010 @ 10:58


RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

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