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

13/09/2010

לכידת פלט של SQL דינאמי

Filed under: Uncategorized — תגיות: , , , — גרי רשף @ 14:19

אנחנו רוצים לקלוט לתוך משתנה את מספר השורות בטבלה או אולי במשפט SQL, למשל טבלת המערכת sysobjects:

Declare    @Cnt Int;

Select    @Cnt=Count(*) From sys.objects;

Select    @Cnt;

Go

קל ופשוט!

מה נעשה אם נקבל את שם הטבלה בתור משתנה? במקרה זה נצטרך לבנות ולהריץ משפט SQL דינאמי מכיוון שלא ניתן להריץ משפט בסגנון Select Count(*) From @Tbl, ואזי איך נקלוט את התוצאה לתוך משתנה?

להלן דוגמה כיצד:

Declare @Tbl NVarchar(Max),

        @SQL NVarchar(Max),

        @Cnt1 Int;


Select    @Tbl='sys.objects';


Select    @SQL='Select @Cnt2 = Count(*) 

                From '+@Tbl


Exec SP_ExecuteSQL @SQL,

                N'@Cnt2 Int Output',

                @Cnt2 = @Cnt1 Output;


Select    @Cnt1;

פרוצדורת המערכת SP_ExecuteSQL מריצה פקודות SQL דינאמיות,

ויש להבחין בין המשתנה Cnt2@ שמתקיים רק בקונטקסט של ה-SQL הדינאמי ומשמש כמשתנה Output,

והמשתנה Cnt1@ שקולט את הערך שלו.

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

5 תגובות »

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

    תגובה של פלג — 13/09/2010 @ 16:40

  2. אבל אתה יכול לבנות שם SQL דינמי, או שהתכוונת למשהו אחר?

    תגובה של פלג — 13/09/2010 @ 15:13

    • אני יכול – כפי שהתכוונת – לכתוב משהו כזה (ומתנצל מראש אם הכיתוב באנגלית ועברית מצ'טקמק):

      Select *
      From OpenRowSet('SQLNCLI',
      'Server=localhost;Trusted_Connection=yes;',
      'Select Count(*) From sys.objects');

      אבל אינני יכול לכתוב משהו כזה:

      Declare @SQL Varchar(Max);
      Set @SQL='Select Count(*) From sys.objects';
      Select *
      From OpenRowSet('SQLNCLI',
      'Server=localhost;Trusted_Connection=yes;',
      @SQL);

      כלומר- זה נראה דינאמי אבל זה לא באמת..

      תגובה של גרי רשף — 13/09/2010 @ 15:53

  3. אפשר לעשות אותו טריק עם OPENROWSET

    תגובה של פלג — 13/09/2010 @ 14:37

    • נכון, אבל למיטב זכרוני- OpenRowSet אינו מקבל משתנים.
      כלומר- בתוך פקודת ה-OpenRowSet יש לכתוב את פקודת ה-SQL ולא ניתן להציב שם משתנה טקסטואלי שכולל בפנים את הפקודה.

      תגובה של גרי רשף — 13/09/2010 @ 15:07


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

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

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