automatic generate create table sql
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,点击(此处)折叠或打开--CREATE PROCEDURE gen_createtbl @tbl_name varchar(100)--ASset nocount on--声明游标需要的变量decla
千家信息网最后更新 2025年01月21日automatic generate create table sql
点击(此处)折叠或打开
- --CREATE PROCEDURE gen_createtbl @tbl_name varchar(100)
- --AS
- set nocount on
- --声明游标需要的变量
- declare @tblname varchar(100),
- @colno int,
- @colname varchar(100),
- @IsIdt bit,
- @ispk bit,
- @type varchar(100),
- @length int,
- @decim int,
- @isnull bit,
- @default varchar(100),
- @sql varchar(2000),--for create table
- @sql2 varchar(1000),--for create pk
- @sql3 varchar(1000), --for create CONSTRAINT
- @sql4 varchar(1000),-- for default value
- @sql5 varchar(1000),--for col comments
- @sql6 varchar(1000),--for table comments
- @tbl varchar(100),
- @idx varchar(100),
- @idxp varchar(100),
- @colname2 varchar(100),
- @comments varchar(100),--注释
- @tbcomments varchar(100),
- @col_id int,--索引中该字段的排列位置
- @col_num int,--索引包含的总列数
- @idx_type_desc varchar(100), --索引类型描述
- @is_unique bit --是否唯一
- set @tblname='sbj_retail_store_info'
- set @sql4=''
- --声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
- declare mycursor cursor for
- SELECT 表名 = case when a.colorder=1 then d.name else '' end,
- 表说明 = cast((case when a.colorder=1 then isnull(f.value,'') else '' end) as varchar(100)),
- 字段序号 = a.colorder,
- 字段名 = a.name,
- 标识 = case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '1'else '' end, --IDENTITY(1,1)
- 主键 = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
- SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 1 else 0 end,
- 类型 = b.name,
- --占用字节数 = a.length,
- 长度 = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
- 小数位数 = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
- 允许空 = case when a.isnullable=1 then '1'else '' end,
- 默认值 = isnull(e.text,''),
- 字段说明 = cast(isnull(g.[value],'') as varchar(100))
- FROM syscolumns a
- left join systypes b on a.xusertype=b.xusertype
- inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
- left join syscomments e on a.cdefault=e.id
- left join sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id and g.name='MS_Description'
- left join sys.extended_properties f on d.id=f.major_id and f.minor_id=0 and f.name='MS_Description'
- where d.name =@tblname --如果只查询指定表,加上此条件,表名
- order by a.id,a.colorder
- /*create temp table to get the comments*/
- create table #comtmp(
- [sql] varchar(3000)
- )
- /*create temp table to get index info and order*/
- create table #idxtmp(
- [tb_name] varchar(100),
- [idx_name] varchar(100),
- [col_name] varchar(100),
- [col_id] int,
- [idx_type_desc] varchar(100),
- [is_unique] bit)
- insert into #idxtmp
- SELECT
- tab.name AS [tb_name],--[表名],
- idx.name AS [idx_name],--[约束名称],
- col.name AS [col_name],--[约束列名],
- idxCol.key_ordinal AS [col_id],--[索引列顺序]
- idx.type_desc as[idx_type_desc], --[索引类型描述]
- idx.is_unique AS [is_unique] --[是否唯一]
- FROM
- sys.indexes idx
- JOIN sys.index_columns idxCol
- ON (idx.object_id = idxCol.object_id
- AND idx.index_id = idxCol.index_id
- AND idx.is_unique_constraint = 1)
- JOIN sys.tables tab
- ON (idx.object_id = tab.object_id)
- JOIN sys.columns col
- ON (idx.object_id = col.object_id
- AND idxCol.column_id = col.column_id)
- where tab.name=@tblname
- declare mycursor2 cursor for
- select a.[tb_name],a.[idx_name],a.[col_name],a.[col_id],b.[col_num],a.[idx_type_desc],a.[is_unique]
- from #idxtmp a
- left join (select [tb_name], [idx_name],count(1) col_num from #idxtmp group by [tb_name], [idx_name]) b
- on a.tb_name=b.tb_name
- and a.idx_name=b.[idx_name]
- --打开游标
- open mycursor
- --从游标里取出数据赋值到我们刚才声明的2个变量中
- fetch next from mycursor into @tblname,@tbcomments,@colno,@colname,@IsIdt,@ispk,@type,@length,@decim,@isnull,@default,@comments
- --判断游标的状态
- -- 0 fetch语句成功
- ---1 fetch语句失败或此行不在结果集中
- ---2 被提取的行不存在
- while (@@fetch_status=0)
- begin
- --显示出我们每次用游标取出的值
- --print '游标成功取出一条数据'
- if @colno=1
- begin
- set @tbl=@tblname
- set @sql='CREATE TABLE [dbo].['+@tblname+'](
- ['+@colname+'] ['+@type+'] '+(case @isnull when 0 then 'NOT NULL,' else 'NULL,'end)
- set @sql6='EXEC sys.sp_addextendedproperty @name=N'+''''+'MS_Description'+''',@value=N'+''''+@tbcomments+''',@level0type=N'+'''SCHEMA'+''',@level0name=N'+'''dbo'
- +''', @level1type=N'+'''TABLE'+''',@level1name=N'+''''+@tbl+''''
- insert into #comtmp([sql]) values (@sql6)
- -- print @sql6
- set @sql5='EXEC sys.sp_addextendedproperty @name=N'+'''MS_Description'+''', @value=N'+''''+@comments+''',@level0type=N'+''''+'SCHEMA'+''',@level0name=N'
- +'''dbo'+''',@level1type=N'+''''+'TABLE'+''''+',@level1name=N'+''''+@tbl+''', @level2type=N'+''''+'COLUMN'+''','+'@level2name=N'+''''+@colname+''''
- insert into #comtmp([sql]) values (@sql5)
- -- print @sql5
- end
- else
- begin
- set @tbl=@tbl+''
- --去掉ETL_CRC QA_RULE_CHK_FLG QA_MANUAL_FLG CREATE_BY UPDATE_BY 这五个字段
- if @colname in('ETL_CRC','QA_RULE_CHK_FLG','QA_MANUAL_FLG','CREATE_BY','UPDATE_BY')
- begin
- set @sql=@sql+''
- end
- else
- begin
- set @sql=@sql+'
- '+'['+@colname+'] ['+(case @type
- when 'timestamp' then 'bigint'+']'
- when 'varchar' then @type +']' +'('+cast(@length as varchar(10))+')'
- when 'nvarchar' then @type +']' +'('+cast(@length as varchar(10))+')'
- when 'char' then @type +']' +'('+cast(@length as varchar(10))+')'
- when 'decimal' then @type +']'+'('+cast(@length as varchar(10))+','+cast(@decim as varchar(3))+')'
- else @type+']'end )+
- (case @isnull when 0 then ' NOT NULL,' else ' NULL,'end)
- set @sql5='EXEC sys.sp_addextendedproperty @name=N'+'''MS_Description'+''', @value=N'+''''+@comments+''',@level0type=N'+''''+'SCHEMA'+''',@level0name=N'
- +'''dbo'+''',@level1type=N'+''''+'TABLE'+''''+',@level1name=N'+''''+@tbl+''', @level2type=N'+''''+'COLUMN'+''','+'@level2name=N'+''''+@colname+''''
- -- print @sql5
- insert into #comtmp([sql]) values (@sql5)
- end
- end
- If @ispk=1
- begin
- set @sql2='PRIMARY KEY CLUSTERED
- (
- ['+@colname+'] ASC
- ))
- GO'
- end
- else
- begin
- set @sql2=@sql2+''
- end
- If @default <>'' and @colname not in('ETL_CRC','QA_RULE_CHK_FLG','QA_MANUAL_FLG','CREATE_BY','UPDATE_BY')
- begin
- set @sql4=@sql4+'
- ALTER TABLE [dbo].['+@tbl+'] ADD DEFAULT '+@default+' FOR ['+@colname+']
- GO'
- end
- else
- begin
- set @sql4=@sql4+''
- end
- --用游标去取下一条记录 -
- fetch next from mycursor into @tblname,@tbcomments,@colno,@colname,@IsIdt,@ispk,@type,@length,@decim,@isnull,@default,@comments
- end
- --关闭游标
- close mycursor
- --撤销游标
- DEALLOCATE mycursor
- print @sql
- print @sql2
- print @sql4
- --声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
- --打开游标
- set @idx=0
- open mycursor2
- --从游标里取出数据赋值到我们刚才声明的2个变量中
- fetch next from mycursor2 into @tblname,@idx,@colname2,@col_id,@col_num,@idx_type_desc,@is_unique
- --判断游标的状态
- -- 0 fetch语句成功
- ---1 fetch语句失败或此行不在结果集中
- ---2 被提取的行不存在
- while (@@fetch_status=0)
- begin
- --显示出我们每次用游标取出的值
- if @idx<>isnull(@idxp,'')
- begin
- set @sql3='ALTER TABLE [dbo].['+@tblname+'] ADD CONSTRAINT ['+@idx+'] '+(case when @is_unique=1 then'UNIQUE 'else '' end) +@idx_type_desc+'
- ( ['+@colname2+'] ASC'
- end
- else
- begin
- set @sql3=@sql3+'
- ['+@colname2+'] ASC'
- end
- if @col_id< @col_num
- begin
- set @sql3=@sql3+' ,'
- end
- else
- begin
- set @sql3=@sql3+')'
- print @sql3
- end
- --用游标去取下一条记录 -
- set @idxp=@idx
- fetch next from mycursor2 into @tblname,@idx,@colname2,@col_id,@col_num,@idx_type_desc,@is_unique
- end
- --关闭游标
- close mycursor2
- --撤销游标
- DEALLOCATE mycursor2
- if object_id('tempdb..#idxtmp') is not null
- begin
- --select * from #idxtmp
- drop table #idxtmp
- end
- select * from #comtmp
- drop table #comtmp
- set nocount on
- GO
游标
语句
变量
字段
索引
成功
数据
类型
相同
个数
参数
状态
结果
位数
位置
名称
字节
小数
序号
条件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库 2003版本
网络安全概论 刘建伟pdf
命运2怎么看服务器
社区开展网络安全知识简报
初步理解互联网科技
第一层服务器是什么
中国电信服务器中标公告
ubuntu18安装数据库
大学生网络安全意识培训测试
奉化专业软件开发周期
邯郸互联网软件开发定制
c语言中调用文件的数据库
软件开发最基础的测试是什么
临床数据库是什么
汕头支付软件开发常见问题
个人服务器有什么用
gps信息如何传送到数据库
北师大 计算机网络技术
上海致骋互联网科技
语音聊天软件开发费
统一软件开发服务应用
北京云服务器租用虚拟主机
南理工网络安全学院专硕几年
软件开发边界问题
游戏软件开发公司财务分析报告
三维平台软件开发
免费好用的数据库接口
intel 金牌服务器
无线网络技术演进趋势
武大网络安全研究生