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

16/03/2011

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

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

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

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

להגיב »

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

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

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

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