automatic generate create table sql
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,点击(此处)折叠或打开--CREATE PROCEDURE gen_createtbl @tbl_name varchar(100)--ASset nocount on--声明游标需要的变量decla
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
东营轻工业软件开发咨询
我的世界本地联机无法连接服务器
数据库安全的第一道屏障
网络安全师需要掌握什么
苏州金税盘安全服务器地址
服务器主板支持pci 拆分选项
工业软件开发大学排名
网络安全锁被解除怎么办
软件开发沈阳工资多少钱
软件开发开发加班申请理由
金融学有哪些数据库
天津高校党建软件开发软件
深圳百鸽互联网科技公司
分布式数据库主键特点
网络技术考题频率
金山区网络技术开发报价表
大学生网络安全意识可行性
浪潮是边缘服务器
微信小程序共享一个服务器
吃海鲜视频软件开发
国产mysql兼容数据库
铁路集团网络安全红线管理
电脑桌面的游戏用什么数据库
我的世界服务器创建视频
超微服务器带系统吗
数据库结构中参照完整性的定义
数据库无法覆盖
数据库是database
上海启墨网络技术
临沧ios软件开发