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