Browse by Tags
All Tags »
SP_ExecuteSQL (
RSS)
כשמריצים SQL דינמי ניתן לעשות שימוש באחת משתי פרוצדורות המערכת הנ"ל. ה-DBA-ים הוותיקים בוודאי זוכרים במעורפל משהו על כך ש-SP_ExecuteSQL עדיפה מפני שהיא יכולה למחזר Execution Plans, אך מה זה בדיוק אומר ומי מבין השתיים עדיפה ומתי? נפתח ברשימת המצרכים- טבלה עליה נוכל להריץ את הקודים הדינמיים: Use tempdb; Go If Object_ID( 'T_Messages' , 'U' ) Is Not Null Drop Table T_Messages; Go Select * Into T_Messages From sys.messages; Select * From T_Messages; וכך נשלוף בעזרת SQL...
נניח שאנחנו קולטים נתונים ממסך בו צריך להזין ערך מספרי, אך לעיתים נכתבת שם נוסחה. למשל- מישהו כותב 2011-1960 במקום את גילו (51), או אולי 120*1.165 כדי לציין ערך כולל מע"מ וכו'; ואת הערך הזה יש לתרגם לערך מספרי. מתימטית זו אינה בעייה קשה במיוחד, אבל אם יש לנו משתנה טקסטואלי שתוכנו הוא חישובי, כיצד נחלץ ממנו את התוצאה למשתנה אחר? אפשר להשתמש למשל בפרוצדורה SP_ExecuteSQL שמאפשרת להריץ קוד דינאמי, ואת התוצאה להפנות למשתנה (הבעייה כאן היא לחלץ את מה שרץ בחלק הדינאמי אל מחוץ לחלק הדינאמי - פעולה...
לפני שנה בדיוק פירסמתי פוסט לגבי השוואה בין טבלאות. אני והקולגות משתמשים בשיטה הזו לא מעט, ולנוחות כולם כתבתי פרוצדורה פשוטה שמקבלת כקלט שם של טבלה, מבצעת את ההשוואה, וגם מדפיסה כבונוס את פקודת ה-SQL למי שירצה לשחק איתה, להגביל אותה, או לחקור אותה: Create Proc P_TblDif @Tbl As Sysname, @RmtServer As Sysname= 'MyProdServer' As Declare @LclServer As Sysname, @Cols As Varchar ( Max ), @ SQL As NVarchar( Max ); Set @LclServer=@@ServerName; Set @ SQL = 'Select ...
אנחנו רוצים לקלוט לתוך משתנה את מספר השורות בטבלה או אולי במשפט 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...