生成建表脚本up_CreateTable
已经很久没用使用这个脚本了,今天用到,并做修改,增加了生成扩展属性功能。
Go
if object_ID('[up_CreateTable]') is not null
Drop Procedure [up_CreateTable]
Go
/* 生成建表脚本(V4.0) Andy 2017-3-28 */
Create Proc up_CreateTable
(
@objectList nvarchar(max)=null
)
as
--With ENCRYPTION /* 参数说明:
@objectList 对象列表,对象之间使用","隔开 存储过程生成的建表脚本,包含Column,Constraint,Index,extended_properties Modify: andy 2017-3-28 增加了扩展属性
*/
Set Nocount On
Declare @sql nvarchar(max),
@objectid int,
@id int,
@Rowcount int,
@ObjectName sysname,
@Enter nvarchar(2),
@Tab nvarchar(2) Select @Enter=Char(13)+Char(10),
@Tab=Char(9) Declare @Tmp Table(name sysname) If @objectList>''
Begin
Set @sql='Select N'''+Replace(@objectList,',',''' Union All Select N''')+''''
Insert Into @Tmp (name) Exec(@sql) Set @sql=null
Select @sql=Isnull(@sql+',','')+name
From @Tmp As a
Where Not Exists(Select 1 From sys.objects Where type='U' And name=a.name) If @sql>''
Begin
Set @sql='发现无效的表名: '+@sql
Raiserror (50001,-1,-1, @sql)
Return(1) End
End If object_id('tempdb..#Objects') Is Not Null
Drop Table #Objects If object_id('tempdb..#Columns') Is Not Null
Drop Table #Columns Create Table #Objects(id int Identity(1,1) Primary Key,object_id int,name sysname) ;With t As
(
Select Object_id,Convert(int,0) As LevelNo,name As object_name
From sys.objects a
Where Type='U' And is_ms_shipped=0 And Not Exists(Select 1 From sys.foreign_keys Where referenced_object_id=a.object_id)
Union All
Select a.referenced_object_id As Object_id,b.LevelNo+1 As LevelNo,c.name As object_name
From sys.foreign_keys a
Inner Join t b On b.object_id=a.parent_object_id
Inner Join sys.objects c On c.object_id=a.referenced_object_id And c.is_ms_shipped=0
where a.referenced_object_id<>a.parent_object_id
)
Insert Into #Objects(object_id,name)
Select a.object_id,object_name
From t a
Where Not Exists(Select 1 From t Where object_id=a.object_id And LevelNo>a.LevelNo) And
Not Exists(Select 1 From sys.extended_properties Where major_id=a.object_id And minor_id=0 And class=1 And Name=N'microsoft_database_tools_support')
And (Exists(Select 1 From @Tmp Where name=a.object_name) Or Not Exists(Select 1 From @Tmp))
Group By object_id,object_name,LevelNo
Order By LevelNo Desc Set @Rowcount=@@Rowcount
If @Rowcount=0
Begin
-- Raiserror 50001 N'没有可以生产脚本的表!'
Raiserror (50001,-1,-1, N'没有可以生产脚本的表!')
Return(1)
End --Column
Select a.object_id,
a.column_id As Seq,
Cast(1 As tinyint) As DefinitionType,
Quotename(a.name)+Char(32)+ c.name +
Case
When a.user_type_id In (231,239) Then '('+Case a.max_length When -1 Then 'Max' Else Rtrim(a.max_length/2) End +')'
When a.user_type_id In (62,165,167,173,175) Then '('+Case a.max_length When -1 Then 'Max' Else Rtrim(a.max_length) End+')'
When a.user_type_id In (106,108) Then '('+Rtrim(a.[precision])+','+Rtrim(a.scale)+')'
Else ''
End
+ Char(32)+
Case a.is_rowguidcol When 1 Then 'Rowguidcol ' Else '' End +
Case a.is_identity When 1 Then 'Identity('+Cast(d.seed_value As nvarchar(10))+','+Cast(d.increment_value As nvarchar(10))+') ' Else '' End+
Case a.is_nullable When 1 Then 'Null ' Else 'Not Null ' End+
Isnull('Constraint '+Quotename(e.name)+' Default('+e.definition+')','') As definition Into #Columns
From sys.columns As a
Inner Join #Objects As b On b.object_id=a.object_id
Inner Join sys.types As c On c.user_type_id=a.user_type_id
Left Outer Join sys.identity_columns As d On d.object_id=a.object_id And d.column_id=a.column_id And a.is_identity=1
Left Outer Join sys.Default_constraints As e On e.object_id=a.default_object_id And e.parent_column_id=a.column_id Create Nonclustered Index IX_#Columns_object_id On #Columns(object_id Asc) --Constraint
Insert Into #Columns Select a.parent_object_id As object_id,
Row_number() Over(Partition By a.parent_object_id Order By Case a.type When 'PK' Then 1 When 'C' Then 2 Else 3 End)As Seq,
2 As DefinitionType,
'Alter Table '+Quotename(object_name(a.parent_object_id)) +' Add Constraint '+Quotename(a.name)+
Case a.type
When 'PK' Then ' Primary Key '+Case When Exists(Select 1 From sys.indexes Where object_id=a.parent_object_id And is_primary_key=1 And type=1) Then N'Clustered ' Else N'Nonclustered ' End+
'('+Stuff((Select ','+Quotename(c1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
From sys.index_columns As a1
Inner Join sys.indexes As b1 On b1.object_id=a1.object_id And b1.index_id=a1.index_id And b1.is_primary_key=1
Inner Join sys.columns As c1 On c1.object_id=a1.object_id And c1.column_id=a1.column_id
Where a1.object_id=a.parent_object_id
For Xml Path('')
),1,1,'')+
')'
When 'F' Then ' Foreign Key ('+Stuff((Select ','+Quotename(b1.Name)
From sys.foreign_key_columns As a1
Inner Join sys.columns As b1 On b1.object_id=a1.parent_object_id And b1.column_id=a1.parent_column_id
Where a1.constraint_object_id=a.object_id
Order By a1.constraint_column_id
For Xml Path('')
),1,1,'')+
') References '+(Select Quotename(object_name(referenced_object_id)) From sys.foreign_keys Where object_id=a.object_id)+
' ('
+Stuff((Select ','+Quotename(b1.Name)
From sys.foreign_key_columns As a1
Inner Join sys.columns As b1 On b1.object_id=a1.referenced_object_id And b1.column_id=a1.referenced_column_id
Where a1.constraint_object_id=a.object_id
Order By a1.constraint_column_id
For Xml Path('')
),1,1,'')+
')'
When 'UQ' Then ' Unique'+(Select Case a1.type When 1 Then ' Clustered' Else ' Nonclustered' End
From sys.indexes As a1
Where a1.object_id=a.parent_object_id
And Exists(Select 1 From sys.key_constraints Where object_id=a.object_id And parent_object_id=a1.object_id And unique_index_id=a1.index_id)
)+
'('+Stuff((Select ','+Quotename(c1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
From sys.index_columns As a1
Inner Join sys.indexes As b1 On b1.object_id=a1.object_id And b1.index_id=a1.index_id And b1.is_unique_constraint=1
Inner Join sys.columns As c1 On c1.object_id=a1.object_id And c1.column_id=a1.column_id
Where a1.object_id=a.parent_object_id
And Exists(Select 1 From sys.key_constraints Where object_id=a.object_id And parent_object_id=a1.object_id And unique_index_id=a1.index_id)
For Xml Path('')
),1,1,'')+
')'
When 'C' Then ' Check' +(Select definition From sys.check_constraints Where object_id=a.object_id)
Else ''
End As definition From sys.objects As a
Where a.type In('PK','F','C','UQ')
And Exists(Select 1 From #Objects Where object_id=a.parent_object_id) --Index
Insert Into #Columns
Select a.object_id ,
a.index_id As Seq,
3 As DefinitionType,
'Create '+Case a.is_unique When 1 Then 'Unique ' Else '' End+
Case a.type When 1 Then 'Clustered ' Else 'Nonclustered ' End+
'Index '+Quotename(a.name)+' On '+Quotename(b.name)+
' ('+Stuff((Select ','+Quotename(b1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
From sys.index_columns As a1
Inner Join sys.columns As b1 On b1.object_id=a1.object_id And b1.column_id=a1.column_id
Where a1.object_id=a.object_id And a.index_id=a1.index_id And a1.is_included_column=0
For Xml Path('')
),1,1,'')+
')'+
Isnull(' Include('+Stuff((Select ','+Quotename(b1.Name)
From sys.index_columns As a1
Inner Join sys.columns As b1 On b1.object_id=a1.object_id And b1.column_id=a1.column_id
Where a1.object_id=a.object_id And a.index_id=a1.index_id And a1.is_included_column=1
For Xml Path('')
),1,1,'')+
')','')
As definition
From sys.indexes As a
Inner Join #Objects As b On b.object_id=a.object_id
Where a.type>0
And Not Exists(Select 1 From sys.key_constraints Where parent_object_id=a.object_id And unique_index_id=a.index_id) --extended_properties Andy 2017-3-28 添加扩展属性
insert into #Columns
select b.object_id,
a.major_id as Seq,
4 as DefinitionType,
case a.minor_id
when 0 then 'execute sp_addextendedproperty ''MS_Description'','''+convert(nvarchar(max),a.value)+''', ''user'', ''dbo'', ''table'', '+quotename(b.name,'''')
else 'execute sp_addextendedproperty ''MS_Description'','''+convert(nvarchar(max),a.value)+''', ''user'', ''dbo'', ''table'', '+quotename(b.name,'''')+',''column'','+quotename(c.name,'''')
end
from sys.extended_properties a
inner join #Objects b on b.object_id=a.major_id
inner join sys.columns c on c.object_id=b.object_id
and c.column_id=a.minor_id
where a.class=1 --Print /*
Print 'Use '+Quotename(db_name())+@Enter+'Go'+@Enter+'/* 创建表结构 Andy '+Convert(nvarchar(10),Getdate(),120)+'*/'+@Enter Set @id=1
While @id<=@Rowcount
Begin
Select @objectid=object_id,@ObjectName=name From #Objects Where id=@id Set @Sql=@Enter+'--('+Rtrim(@id)+'/'+Rtrim(@Rowcount)+') '+@ObjectName+@Enter+'If object_id('''+Quotename(@ObjectName)+''') Is Null'+@Enter+'Begin'+@Enter+@Tab+
'Create Table '+Quotename(@ObjectName)+@Enter+@Tab+'('+@Enter
Select @Sql=@Sql+@Tab+@Tab+definition+','+@Enter
From #Columns
Where object_id=@objectid
And DefinitionType=1
Group By Seq,definition
Order By Seq
Set @sql=Substring(@sql,1,Len(@sql)-3)+@Enter+@Tab+')'+@Enter
Select @Sql=@Sql+@Tab+definition+@Enter
From #Columns
Where object_id=@objectid
And DefinitionType>1
Group By DefinitionType,Seq,definition
Order By Seq Print Substring(@sql,1,Len(@sql)-2)+@Enter+'End'
Set @id=@id+1
End */
--Modify Nr:20100510 Start
Declare @MaxRow int if object_id('tempdb..#Print') Is Not Null
Drop Table #Print Create Table #Print(Row int Identity(1,1) Primary Key,Sql nvarchar(4000)) Print 'Use '+Quotename(db_name())+@Enter+'Go'+@Enter+'/* 创建表结构 Andy '+Convert(nvarchar(10),Getdate(),120)+'*/'+@Enter Set @id=1
While @id<=@Rowcount
Begin
Select @objectid=object_id,@ObjectName=name From #Objects Where id=@id Insert Into #Print(Sql)
Select @Enter+'--('+Rtrim(@id)+'/'+Rtrim(@Rowcount)+') '+@ObjectName+@Enter+'If object_id('''+Quotename(@ObjectName)+''') Is Null'+@Enter+'Begin'+@Enter+@Tab+
'Create Table '+Quotename(@ObjectName)+@Enter+@Tab+'('+@Enter Insert Into #Print(Sql)
Select @Tab+@Tab+definition+','+@Enter
From #Columns
Where object_id=@objectid
And DefinitionType=1
Group By Seq,definition
Order By Seq Set @MaxRow=Scope_identity()
Update #Print
Set Sql=Substring(sql,1,Len(sql)-3)+@Enter+@Tab+')'+@Enter
Where Row=@MaxRow Insert Into #Print(Sql)
Select @Tab+definition+@Enter
From #Columns
Where object_id=@objectid
And DefinitionType>1
Group By DefinitionType,Seq,definition
Order By Seq if @@ROWCOUNT >0
Set @MaxRow=Scope_identity() Update #Print
Set Sql= Substring(Sql,1,Len(Sql)-2)+@Enter+'End'
Where Row=@MaxRow Set @id=@id+1
End Set @id=1
While @id>0
Begin
Set @sql=''
Select @sql=sql From #Print Where row=@id If @sql>''
Begin
Print @sql
Set @id=@id+1
end
Else
Set @id=0
End --Modify Nr:20100510 End Print 'Go' Drop Table #Columns
Drop Table #Objects Go
生成建表脚本up_CreateTable的更多相关文章
- SQL SERVER 生成建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_MSSQL] Script Date: 06/15/2012 11:59:00 ***** ...
- (转)SQL SERVER 生成建表脚本
https://www.cnblogs.com/champaign/p/3492510.html /****** Object: StoredProcedure [dbo].[GET_TableScr ...
- SQL SERVER 生成MYSQL建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_MYSQL] Script Date: 06/15/2012 13:05:14 ***** ...
- SQL SERVER 生成ORACLE建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_ORACLE] Script Date: 06/15/2012 13:07:16 **** ...
- PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入T ...
- powerdesigner中将表的name在生成建表sql时生成注释
1.为powerdesigner的表设置注释方法: powerdesigner默认没有注释: 设置方法: 选择那个表 右键- >Properties- >Columns- >Cust ...
- sqlserver 表中记录生成insert,可以加条件,可以生成建表语句
sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...
- 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句
在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...
- MySql 建库建表脚本
1.建库 CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2.建表脚本 CREATE TABLE `c ...
随机推荐
- Person Re-ID行人重试别数据集
1. 杜克大学数据(DukeMTMC-reID) DukeMTMC 数据集是一个大规模标记的多目标多摄像机行人跟踪数据集.它提供了一个由 8 个同步摄像机记录的新型大型高清视频数据集,具有 7,000 ...
- P1938 [USACO09NOV]找工就业Job Hunt
P1938 [USACO09NOV]找工就业Job Hunt给边赋予价值,入边的权值为D-Ti,然后从起点开始跑最长路,如果钱的总数超过了D*C,也就是一定有一个城市走了两遍,则有正环,则输出-1 # ...
- springboot2 redis
本项目使用jar包: <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Xamarin Essentials教程发送邮件Email
Xamarin Essentials教程发送邮件Email 邮件是一种更为灵活的数据分享方式.它可以帮助用户将一个应用程序的数据分享给其他用户,而其他用户不需要安装特定的应用程序,就可以在任意时间 ...
- 英语口语练习系列-C33-露营-谈论日期-离思
词汇-露营 Camping camping 露营 campground camping camper picnic bonfire backpack tent public campground co ...
- php 将16进制数串转换为二进制数据的函数
/** * 将16进制数串转换为二进制数据的函数 * @param $hexdata * @return string bindata */ function ...
- Iview-datePicker获取选中的日期,如果没有选,提示错误,选了,错误隐藏
最近遇到大坑,,最后解决了,直接上代码 npm intall iview main.js中引入 import iView from 'iview'; import 'iview/dist/styles ...
- numpy快速入门
numpy快速入门 numpy是python的科学计算的核心库,很多更高层次的库都基于numpy.博主不太喜欢重量级的MATLAB,于是用numpy进行科学计算成为了不二选择. 本文主要参考Scipy ...
- PAT Basic 1002
1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1 ...
- 【网站管理6】_一个网站SEO优化方案
首先,前端/页编人员主要负责站内优化,主要从四个方面入手: 第一个,站内结构优化 合理规划站点结构(1.扁平化结构 2.辅助导航.面包屑导航.次导航) 内容页结构设置(最新文章.推荐文章.热门文章.增 ...