1 *============================================================== 2 名称: [ GetMSSQLTableScript ] 3 功能: 获取customize单个表的mysql脚本 4 创建:2015年3月23日 5 参数: @DBName -- 数据库名称 6 @TBName -- 表名 7 @SchemeName -- 数据库表引用的
1 *==============================================================
2 名称: [ GetMSSQLTableScript ]
3 功能: 获取customize单个表的mysql脚本
4 创建:2015年3月23日
5 参数: @DBName -- 数据库名称
6 @TBName -- 表名
7 @SchemeName -- 数据库表引用的Scheme
8 @PartitionScheme -- 分区Scheme
9 @PartitionField -- 该表使用的分区字段
10 @SQL -- 输出脚本
11 ==============================================================*/
12 ALTER PROCEDURE [ Tuning ] . [ GetMSSQLTableScript ] (
13 @DBName nvarchar ( 64 ),
14 @SchemeName nvarchar ( 32 ),
15 @TBName nvarchar ( 128 ),
16 @PartitionScheme nvarchar ( 32 ),
17 @PartitionField nvarchar ( 32 ),
18 @SQL nvarchar ( max ) OUTPUT
19 )
20 AS
21 Begin
22 declare @table_script nvarchar ( max ) -- 建表的脚本
23 declare @index_script nvarchar ( max ) -- 索引的脚本
24 declare @default_script nvarchar ( max ) -- 默认值的脚本
25 declare @check_script nvarchar ( max ) -- check约束的脚本
26 declare @sql_cmd nvarchar ( max ) -- 动态SQL命令
27 declare @err_info varchar ( 200 )
28 set @TBName = UPPER ( @TBName );
29 if OBJECT_ID ( @DBName + ' . ' + @SchemeName + ' . ' + @TBName ) is null
30 BEGIN
31 set @err_info = ' 对象: ' + @DBName + ' . ' + @SchemeName + ' . ' + @TBName + ' 不存在! '
32 raiserror ( @err_info , 16 , 1 )
33 return
34 END
35
36 -- --------------------生成创建表脚本----------------------------
37 -- 1.添加算定义字段
38 set @table_script = ' CREATE TABLE ' + @SchemeName + ' . ' + @TBName + '
39 ( ' + char ( 13 ) + char ( 10 );
40
41
42 -- 添加表中的其它字段
43 set @sql_cmd = N '
44 use ' + @DBName + '
45 set @table_script= ''''
46 select @table_script=@table_script+
47 '' [ '' +t.NAME+ '' ] ''
48 +(case when t.xusertype in (175,62,239,59,122,165,173) then '' [ '' +p.name+ '' ] ( '' +convert(varchar(30),isnull(t.prec, '''' ))+ '' ) ''
49 when t.xusertype in (231) and t.length=-1 then '' [ntext] ''
50 when t.xusertype in (231) and t.length -1 then '' [ '' +p.name+ '' ] ( '' +convert(varchar(30),isnull(t.prec, '''' ))+ '' ) ''
51 when t.xusertype in (167) and t.length=-1 then '' [text] ''
52 when t.xusertype in (167) and t.length -1 then '' [ '' +p.name+ '' ] ( '' +convert(varchar(30),isnull(t.prec, '''' ))+ '' ) ''
53 when t.xusertype in (106,108) then '' [ '' +p.name+ '' ] ( '' +convert(varchar(30),isnull(t.prec, '''' ))+ '' , '' +convert(varchar(30),isnull(t.scale, '''' ))+ '' ) ''
54 else '' [ '' +p.name+ '' ] ''
55 END)
56 +(case when t.isnullable=1 then '' null '' else '' not null '' end)
57 +(case when COLUMNPROPERTY(t.ID, t.NAME, '' ISIDENTITY '' )=1 then '' identity '' else '''' end)
58 + '' , '' +char(13)+char(10)
59 from syscolumns t join systypes p on t.xusertype = p.xusertype
60 where t.ID=OBJECT_ID( ''' + @SchemeName + ' . ' + @TBName + ''' )
61 ORDER BY t.COLID;
62 '
63 EXEc sp_executesql @sql_cmd ,N ' @table_script varchar(max) output ' , @sql_cmd output
64 set @table_script = @table_script + @sql_cmd
65 IF len ( @table_script ) > 0
66 set @table_script = substring ( @table_script , 1 , len ( @table_script ) - 3 ) + char ( 13 ) + char ( 10 )
67 + ' )On ' + @PartitionScheme + ' ( ' + @PartitionField + ' )
68 ' + char ( 13 ) + char ( 10 )
69 -- +'GO'
70 + char ( 13 ) + char ( 10 ) + char ( 13 ) + char ( 10 )
71
72 -- ------------------生成索引脚本---------------------------------------
73 set @index_script = ''
74 set @sql_cmd = N '
75 use ' + @DBName + '
76 declare @ct int
77 declare @scheme nvarchar(32)
78 declare @indid int --当前索引ID
79 declare @p_indid int --前一个索引ID
80 declare @partitionField nvarchar(32)
81 set @partitionField= ''' + @PartitionField + '''
82 select @indid=-1, @p_indid=0,@ct=0 --初始化,以后用@indid和@p_indid判断是否索引ID发生变化
83 set @index_script= ''''
84 set @scheme= ''' + @SchemeName + '''
85 select @indid=INDID
86 ,@index_script=@index_script
87 +(case when @indid @p_indid and @ct>0
88 then '' ) '' +char(13)+char(10) +char(13)+char(10)
89 else ''''
90 end)
91 +(case when @indid @p_indid and UNIQ= '' PRIMARY KEY ''
92 then '' ALTER TABLE '' +TABNAME+ '' ADD CONSTRAINT '' +name+ '' PRIMARY KEY '' +cluster+char(13)+char(10)+ '' ( '' +char(13)+char(10)+ '' '' +COLNAME+ '' , '' +@partitionField+char(13)+char(10)
93 when @indid @p_indid and UNIQ= '' UNIQUE ''
94 then '' ALTER TABLE '' +TABNAME+ '' ADD CONSTRAINT '' +name+ '' UNIQUE '' +cluster+char(13)+char(10)+ '' ( '' +char(13)+char(10)+ '' '' +COLNAME+ '' , '' +@partitionField+char(13)+char(10)
95 when @indid @p_indid and UNIQ= '' INDEX ''
96 then '' CREATE '' +cluster+ '' INDEX '' +name+ '' ON '' +TABNAME+char(13)+char(10)+ '' ( '' +char(13)+char(10)+ '' '' +COLNAME+char(13)+char(10)
97 when @indid=@p_indid
98 then '' , '' +COLNAME+char(13)+char(10)
99 end)
100 ,@ct=@ct+1
101 ,@p_indid=@indid
102 from
103 (
104 SELECT A.INDID,B.KEYNO
105 ,NAME,@scheme+ '' . '' +(SELECT NAME FROM SYSOBJECTS WHERE ID=A.ID) AS TABNAME,
106 (SELECT NAME FROM SYSCOLUMNS WHERE ID=B.ID AND COLID=B.COLID) AS COLNAME,
107 (CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE= '' UQ '' ) THEN '' UNIQUE ''
108 WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE= '' PK '' ) THEN '' PRIMARY KEY ''
109 ELSE '' INDEX '' END) AS UNIQ,
110 (CASE WHEN A.INDID=1 THEN '' CLUSTERED '' WHEN A.INDID>1 THEN '' NONCLUSTERED '' END) AS CLUSTER
111 FROM SYSINDEXES A INNER JOIN SYSINDEXKEYS B ON A.INDID=B.INDID AND A.ID=B.ID
112 WHERE A.ID=OBJECT_ID( ''' + @SchemeName + ' . ' + @TBName + ''' ) and a.indid 0 /*如果该表是一个分区表,就必须添加条件:and b.keyno 0*/
113 ) t
114 ORDER BY INDID,KEYNO '
115 EXEc sp_executesql @sql_cmd ,N ' @index_script varchar(max) output ' , @sql_cmd output
116 set @index_script = @sql_cmd
117 IF len ( @index_script ) > 0
118 set @index_script = @index_script + ' ) ' + char ( 13 ) + char ( 10 )
119 -- +'go'
120 + char ( 13 ) + char ( 10 ) + char ( 13 ) + char ( 10 )
121 -- 生成默认值约束
122 set @sql_cmd = '
123 use ' + @DBName + '
124 declare @scheme nvarchar(32)
125 declare @partitionField nvarchar(32)
126 set @partitionField= ''' + @PartitionField + '''
127 set @scheme= ''' + @SchemeName + '''
128 set @default_script= ''''
129 SELECT @default_script=@default_script
130 + '' ALTER TABLE '' +@scheme+ '' . '' +OBJECT_NAME(O.PARENT_OBJ)
131 + '' ADD CONSTRAINT '' +O.NAME+ '' default '' +t.text+ '' for '' +C.NAME+char(13)+char(10)+char(13)+char(10)
132 FROM SYSOBJECTS O INNER JOIN SYSCOMMENTS T ON O.ID=T.ID
133 INNER JOIN SYSCOLUMNS C ON O.PARENT_OBJ=C.ID AND C.CDEFAULT=T.ID
134 WHERE O.XTYPE= '' D '' AND O.PARENT_OBJ=OBJECT_ID( ''' + @SchemeName + ' . ' + @TBName + ''' ) '
135 EXEc sp_executesql @sql_cmd ,N ' @default_script varchar(max) output ' , @sql_cmd output
136 set @default_script = @sql_cmd + char ( 13 ) + char ( 10 )
137
138 set @SQL = @table_script + @index_script + @default_script
139 declare @len int , @n int
140 set @len = LEN ( @SQL )
141 set @n = 0
142 while ( @len > 0 )
143 BEGIN
144 PRINT ( substring ( @SQL , @n * 4000 + 1 , 4000 ));
145 set @n = @n + 1
146 set @len = @len - 4000 ;
147 END
148 End
该函数的原创作者:http://HdhCmsTestcnblogs测试数据/champaign/p/3492510.html
本人及修改了一部分内容,让该存储过程更灵活点。
公司DBA支持给建议不要用sysindexkeys来查找对应的列,而是使用syscolumns来提到:
比如:select * from syscolumns where id=object_id('dx.Article');
select * from sys.index_columns where object_id=object_id('dx.Article');
查看更多关于SqlServer2008根据现有表,获取该表的分区创建脚本的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did95324