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

21/03/2011

תגובה אחת

לפני שנה בדיוק פירסמתי פוסט לגבי השוואה בין טבלאות.
אני והקולגות משתמשים בשיטה הזו לא מעט, ולנוחות כולם כתבתי פרוצדורה פשוטה שמקבלת כקלט שם של טבלה, מבצעת את ההשוואה, וגם מדפיסה כבונוס את פקודת ה-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

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

כתיבת תגובה

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

תגובה אחת

  1. kof25/03/2011 ב 20:09

    אדיר, באמת.

    הגב