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

21/03/2011

פרוצדורה להשוואת טבלאות בין הפיתוח לייצור

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

לפני שנה בדיוק פירסמתי פוסט לגבי השוואה בין טבלאות.
אני והקולגות משתמשים בשיטה הזו לא מעט, ולנוחות כולם כתבתי פרוצדורה פשוטה שמקבלת כקלט שם של טבלה, מבצעת את ההשוואה, וגם מדפיסה כבונוס את פקודת ה-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    @Cols_=IsNull(@Cols_+'','','''')+''[''+L.name+'']'''

            +Char(13)+'From    ['+@LclServer+'].'+DB_Name()+'.sys.columns L'

            +Char(13)+'Inner Join ['+@RmtServer+'].'+DB_Name()+'.sys.columns R'

            +Char(13)+'        On L.name=R.name'

            +Char(13)+'Where    L.object_id=(Select object_id From ['+@LclServer+'].'+DB_Name()+'.sys.tables Where name='''+@Tbl+''')'

            +Char(13)+'        And R.object_id=(Select object_id From ['+@RmtServer+'].'+DB_Name()+'.sys.tables Where name='''+@Tbl+''')'

            +Char(13)+'Order By L.column_id;';


Exec    SP_ExecuteSQL @SQL, N'@Cols_ Varchar(Max) Out',@Cols_ = @Cols Out;


Set        @SQL='With L As'

            +Char(13)+'(Select    '+@Cols

            +Char(13)+'From    ['+@LclServer+'].'+DB_Name()+'.dbo.'+@Tbl+'),'

            +Char(13)+'R As'

            +Char(13)+'(Select    '+@Cols

            +Char(13)+'From    ['+@RmtServer+'].'+DB_Name()+'.dbo.'+@Tbl+')'

            +Char(13)+'Select    '''+@LclServer+''' [Server],'

            +Char(13)+'        *'

            +Char(13)+'From    (Select * From R'

            +Char(13)+'        Except'

            +Char(13)+'        Select * From L) T'

            +Char(13)+'Union All'

            +Char(13)+'Select    '''+@RmtServer+''' [Server],'

            +Char(13)+'        *'

            +Char(13)+'From    (Select * From L'

            +Char(13)+'        Except'

            +Char(13)+'        Select * From R) T'

            +Char(13)+'Order By 1;'

Print    @SQL;

Exec(@SQL);

הפרוצדורה אינה מכזה את כל הפינות, ויש לשנות ולתקן אותה על פי הצורך:

1. הקלט הוא שם הטבלה, והשרת (Linked Server) מולו משווים; כשאצלנו ברירת המחדל הוא שרת הייצור (יש לשנות את MyProdServer לשם האמיתי).

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

3. ההפעלה של הפרוצדורה: 'Exec P_TblDiff 'MyTbl

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

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

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

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