אופציית Multi-Value ב-Reporting Services

03/10/2010

אין תגובות

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

Select *

From sys.objects

Where schema_id=@S;

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

מסך הגדרת הפרמטרים כולל גם אפשרות Multi-Value: ניתן יהיה לבחור ערך אחד או יותר מתוך הרשימה:

clip_image002

במקרה כזה (אם נבחר ב-Multi Value)- יש לשנות את השליפה הנ"ל לשליפה הבאה:

Select    *

From    sys.objects

Where    schema_id In (@S);

הסינטקס הזה לכאורה שגוי- נסו להריץ את הקוד הבא ותקבלו שגיאה מכיוון שבעמודה schema_id יש מספרים ו-S@ הוא טקסטואלי:

Declare @S Varchar(Max);

Set @S='1,4';

Select *

From sys.objects

Where schema_id In (@S);

Go

ואם נפלטר עמודה טקסטואלית- אמנם לא נקבל שגיאה, אך גם לא את התוצאות המקוות:

Declare @S Varchar(Max);

Set @S='S,U';

Select *

From sys.objects

Where type In (@S);

Go

הסיבה ברורה- המערכת מתייחסת למשתנה S@ כאל ערך בודד, ואין אף שורה בה עמודת type מכילה את הערך 'S,U'..

מדוע זה כן עובד ב-SSRS? כנראה מפני שהמערכת הופכת את ה-SQL לדינאמי, בערך כמו בדוגמה הזו:

Declare @S Varchar(Max),

@SQL Varchar(Max);

Set @S='1,4';

Set @SQL='Select * From sys.objects Where schema_id In ('+@S+');'

Exec(@SQL);

Go

ומה קורה כשמפעילים פרוצדורה המפעילה שליפה ולא שליפה באופן ישיר?

המערכת תפעיל את הפרוצדורה באופן דינאמי כנ"ל, אבל הפרוצדורה עצמה תרוץ כפי שכתבנו אותה, והשליפה שבתוכה לא תפעל כמתוכנן.. כיצד נכתוב את השליפה בתוך הפרוצדורה כך שתעבוד?

פתרון:

Declare @S Varchar(Max);

Set @S='1,4';

Select *

From sys.objects

Where ','+@S+',' Like '%,'+Cast(schema_id As Varchar)+',%';

Go

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *