开发初期关于自动建表的问题,请教高手!!!

dick517 2003-11-10 10:32:04
实现在下表中输入类似内容:
编号 表名 字段名 字段类型 字段长度 约束
1 a abc char 20 null
2 a dssa char 20 null
3 b asd char 10 null
4 b sdf char 20 null
自动建表得到:
a表:
| abc | dssa
|--------|-------
| sdfs | dsfsd
. .
. .
b表:
|asd | sdf
|-----|------
|ewe |weirwe
求教高手如何实现,存储过程该如何写?
...全文
27 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-11-10
  • 打赏
  • 举报
回复
--下面是测试

--创建建立表的存储过程
create proc p_createtable @tbname varchar(20)
as
declare @sql varchar(8000)
set @sql='create table '+@tbname+'('
select @sql=@sql+字段名+' '
+字段类型
+case when 字段类型 in ('varchar','char','nvarchar','nchar','numeric','decimal')
then '('+cast(字段长度 as varchar)+')' else '' end
+case when 约束<>'' then ' default '+约束 else '' end
+','
from 表结构 where 表名=@tbname order by 编号
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
go

--定义表结构的表
create table 表结构(编号 int identity(1,1),
表名 sysname,
字段名 sysname,
字段类型 sysname,
字段长度 int,
约束 varchar(200))

insert into 表结构
select 'a','abc',' char',20,null
union all select 'a','dssa','char',20,null
union all select 'b','asd',' char',10,null
union all select 'b','sdf',' char',20,null
go

--调用测试
exec p_createtable 'a'
exec p_createtable 'b'

--删除生成的表及数据测试环境
drop table 表结构,a,b
drop proc p_createtable


zjcxc 2003-11-10
  • 打赏
  • 举报
回复
--上面的存储过程有些错误,改一下:

--创建建立表的存储过程
create proc p_createtable @tbname varchar(20)
as
declare @sql varchar(8000)
set @sql='create table '+@tbname+'('
select @sql=@sql+字段名+' '
+字段类型
+case when 字段类型 in ('varchar','char','nvarchar','nchar','numeric','decimal')
then '('+cast(字段长度 as varchar)+')' else '' end
+case when 约束<>'' then ' default '+约束 else '' end
+','
from 表结构 where 表名=@tbname order by 编号
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
go

zjcxc 2003-11-10
  • 打赏
  • 举报
回复
然后调用这个存储过程创建表就可以了:

exec p_createtable 'a'
exec p_createtable 'b'
zjcxc 2003-11-10
  • 打赏
  • 举报
回复
--创建建立表的存储过程
create proc p_createtable @tbname varchar(20)
as
declare @sql varchar(8000)
set @sql='create table '+@tbname+'('
select @sql=@sql+字段名+' '
+vcFieldSort
+case when 字段类型 in ('varchar','char','nvarchar','nchar','numeric','decimal')
then '('+cast(字段长度 as varchar)+')' else '' end
+case when 约束<>'' then ' default '+约束 else '' end
+','
from 表结构 where 表名=@tbname order by 编号
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
go
txlicenhe 2003-11-10
  • 打赏
  • 举报
回复
create table t1(编号 int , 表名 varchar(10), 字段名 varchar(10), 字段类型 varchar(10), 字段长度 int, 约束 varchar(10))
insert t1 select 1,'a','abc' ,'char',20, null
union all select 2,'a','dssa' ,'char',20, null
union all select 3,'b','asd' ,'char',10, null
union all select 4,'b','sdf' ,'char',20, null


declare cursor_insert cursor for select distinct 表名 from t1
declare @i varchar(100),@sql varchar(8000)
set @sql=''
open cursor_insert
fetch cursor_insert into @i
while @@fetch_status=0
begin
select @sql=@sql+','+字段名+' '+字段类型+'('+case when 字段类型 like '%char' then cast(字段长度 as varchar(10)) else '' end+case when 约束 is not null then 'check('+约束+')' else '' end + ')' from t1 where 表名=@i
set @sql=right(@sql,len(@sql)-1)
exec('create table '+@i+' ('+@sql+')')
set @sql = ''
fetch cursor_insert into @i
end
close cursor_insert
deallocate cursor_insert


Select * from a
abc dssa
-------------------- --------------------

(所影响的行数为 0 行)
Select * from b
asd sdf
---------- --------------------

(所影响的行数为 0 行)

drop table t1
drop table a,b
pengdali 2003-11-10
  • 打赏
  • 举报
回复
declare cursor_insert cursor for select distinct 表名 from 你的表
declare @i varchar(100),@sql varchar(8000)
set @sql=''
open cursor_insert
fetch cursor_insert into @i
while @@fetch_status=0
begin
select @sql=@sql+','+字段名+' '+字段类型+case when 字段类型 like '%char' then cast(字段长度 as varchar(10)) else '' end+case when 约束 is not null then 'check('+约束+')' else '' end where 你的表 where 表名=@i
set @sql=right(@sql,len(@sql)-1)
exec('create table '+@i+' ('+@sql+')')
fetch cursor_insert into @i
end
close cursor_insert
deallocate cursor_insert
dick517 2003-11-10
  • 打赏
  • 举报
回复
cc

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧