דרך נוחה לעיון בקוד של פרוצדורות ואובייקטים אחרים (2)

16/03/2011

אין תגובות

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

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

With Tbl As

(Select    object_id,

        name,

        Schema_Name(schema_id) SchemaName,

        'Create Table '+Schema_Name(SCHEMA_ID)+'.'+name+'(' CreateTable

From    sys.tables),

Col As

(Select    object_id,

        column_id,

        Char(13)+Char(9)+Char(9)+'['+name+']'

        +Case When is_computed=0 Then

            ' '+Type_Name(user_type_id)+Case When Type_Name(user_type_id) In ('Char','Varchar') Then '('+Case When max_length=-1 Then 'Max' Else CAST(max_length AS Varchar) End+')'

                                            When Type_Name(user_type_id) In ('NChar','NVarchar') Then '('+Case When max_length=-1 Then 'Max' Else CAST(max_length/2 AS Varchar) End+')'

                                            When Type_Name(user_type_id)='Decimal' Then '('+CAST(precision As Varchar)+','+CAST(scale As Varchar)+')'

                                            Else '' End

            +IsNull(' '+'Collate '+collation_name,'') 

            +Case When is_identity=1 Then ' Identity('+(Select Cast(seed_value As Varchar)+','+Cast(increment_value As Varchar) From sys.identity_columns IC where IC.object_id=C.object_id And IC.column_id=C.column_id)+')' Else '' End

            +' '+Case When is_nullable=0 Then 'Not Null' Else 'Null' End

            +IsNull(' ='+OBJECT_DEFINITION(default_object_id),'')

        Else ' ='+(Select definition From sys.computed_columns CC Where CC.object_id=C.object_id And CC.column_id=C.column_id)

        End

        +',' ColDef

From    sys.columns C),

Cols As

(Select    object_id,

        (Select C1.ColDef As [text()]

            From    Col C1

            Where    C1.object_id=C.object_id

                    --And C1.column_id=C.column_id

            Order By column_id

            For XML Path('')) ColDef

From    Col C

Group By object_id),

PK As

(Select    ','+Char(13)+Char(9)+Char(9)+'Constraint ['+KC.name+'] Primary Key Clustered'

        +'('+IC.Cols+')' SQL,

        IC.object_id

From    (Select    object_id,

                Stuff((Select ','+Char(13)+Char(9)+Char(9)+Char(9)+'['+Col_Name(c1.object_id,c1.column_id)+'] '+Case When C1.is_descending_key=0 Then 'Asc' Else 'Desc' End As [text()]

                    From    sys.index_columns C1

                    Where    C1.object_id=C.object_id

                            --And C1.column_id=C.column_id

                    Order By C1.key_ordinal

                    For XML Path('')),1,1,'') Cols

        From    sys.index_columns C

        Group By C.object_id) IC

Inner Join sys.key_constraints KC 

        On IC.object_id = KC.parent_object_id  

Where    KC.type='PK'),

T As

(Select    T.object_id,

        T.SchemaName,

        T.name ObjectName,

        'User Table' TypeName,

        T.CreateTable

                +Left(C.ColDef,Len(C.ColDef)-1)

                +Cast(IsNull(PK.SQL,'') As Varchar(8000))+');' SQL

From    Tbl T

Inner Join Cols C

        On T.object_id=C.object_id

Left Join PK

        On T.object_id=PK.object_id

Union All

Select    object_id,

        Schema_Name(schema_id) SchemaName,

        Object_Name(object_id) ObjectName,

        type_desc TypeName,

        (Select Object_Definition(object_id) As [text()] From sys.all_objects S1 Where S1.object_id=S.object_id For XML Path('')) SQL

From    sys.all_objects S

Where    type Not In ('AF','C','D','FS','IT','PK','PC','S','SQ','U','X'))

Select    object_id,

        SchemaName,

        ObjectName,

        TypeName,

        Cast(SQL As XML) SQL

From    T

Where    T.SQL Like '%%'

Order By T.ObjectName;

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

כתיבת תגובה

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