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

21/03/2011

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

שייך לקטגוריה: 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 של התגובות על הרשומה הזו טרקבאק קישור

כתיבת תגובה

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

ערכת עיצוב: Shocking Blue Green. בלוג בוורדפרס.קום.

Follow

Get every new post delivered to your Inbox.

הצטרפו אל 25 שכבר עוקבים אחריו