המשימה כשלעצמה לא אמורה להיות מסובכת במיוחד-
יוצרים פרוצדורה שעוברת בלולאה על כל הדטבייסים,
שולפת את שמות הטבלאות לתוך טבלה זמנית,
ולסיום מבצעת Select על הטבלה;
אלא שאני משתדל לתת פתרונות שאינם כוללים יצירה של אובייקטים (מה שמצריך הרשאות מיוחדות והתרפסות בפני ה-DBA),
ושהשליפה נראית כשליפה- פקודת Select שאפשר לפלטר, למיין, לבצע Join וכו';
ומאז שנגלו לי נפלאות ה-OpenRowSet מתברר שניתן להצפין בתוכו קטעי קוד ולקבל את מבוקשי.
נתחיל בקטעי הקוד, ובהמשך נפעיל את ה-OpenRowSet:
Declare @SQL Varchar(Max);
Select @SQL=IsNull(@SQL+' Union All ','')+'Select '''+name+''' DB,name collate Database_Default Tbl From ['+name+'].sys.tables' From sys.databases;
Print @SQL;
Exec(@SQL);
הקוד משרשר לתוך המשתנה @SQL פקודות Select מטבלאות sys.tables בכל הדטבייסים ובינהן Union All,
ואת ה-SQL הדינאמי שהתקבל – מפעיל בעזרת Exec (בדוגמה זו הדפסתי את ה-SQL לבקרה על ידי Print).
בגלל שלדטבייסים יכולים להיות Cillations שונים – מוסיפים Collate Database_Default לעמודות הטקסט.
כעת "נעטוף" את הקוד הנ"ל ב-OpenRowSet ונריץ:
Select *
From OpenRowSet('SQLNCLI',
'Server=.;Trusted_Connection=yes;Database=MyDB',
'set fmtonly off;
Declare @SQL Varchar(Max);
Select @SQL=IsNull(@SQL+'' Union All '','''')+''Select ''''''+name+'''''' DB,name collate Database_Default Tbl From [''+name+''].sys.tables'' From sys.databases;
Exec(@SQL);') T
Order By DB,
Tbl;
לתרגול- אפשר לנסות להוסיף עמודות נוספות, או לפנות לטבלאות מערכת אחרות; למשל ל-sys.objects ולצרף את עמודת type_desc.
תודה רבה זה ממש מעניין
אני מתעניין בשליפה שעוברת על הטבלאות בDB ומוצאת עמודות המכילות ערך ספציפי הכיוון הוא גנרי
אשמח מאד לתשובה יעקב
תגובה מאת yakov luria — 27/03/2012 @ 14:20