求动态字段的思路

sutter 2006-07-19 05:59:19
需求:
比如我们日常建立人员的档案资料,一般都先设计数据库结构,如: 姓名 性别 单位等;想让这些字段都做成动态的,就是列的名字、个数、数据类型 都是动态的,如果客户要求增加一个 职位字段,那么就到管理接口中直接添加一个就行了;
当然这个做法如果直接该表的字段有些不现实,应该可以通过很多表的关联来实现,有没有兄弟做过类似的,请给点提示。
...全文
216 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sutter 2006-07-20
  • 打赏
  • 举报
回复
辛苦 zlp321002(龙卷风2006) 兄弟了, sql2005没有研究过,准备最近看看;结贴了。
gjz_1209 2006-07-19
  • 打赏
  • 举报
回复
学习
fcuandy 2006-07-19
  • 打赏
  • 举报
回复
反正sql2k下你这样设计,等到时间长了总有你哭的时候.
zjcxc 2006-07-19
  • 打赏
  • 举报
回复
sql 2005+xml类型的字段, 这样你想怎么放数据就怎么放数据.
zlp321002 2006-07-19
  • 打赏
  • 举报
回复
create proc addcolumn
@tablename varchar(30), --表名
@colname varchar(30), --要加的列名
@coltype varchar(100), --要加的列类型
@colid int --加到第几列
as

declare @colid_max int
declare @sql varchar(1000) --动态sql语句
--------------------------------------------------
if not exists(select 1 from sysobjects
where name = @tablename and xtype = 'u')
begin
raiserror 20001 '没有这个表'
return -1
end
--------------------------------------------------
if exists(select 1 from syscolumns
where id = object_id(@tablename) and name = @colname)
begin
raiserror 20002 '这个表已经有这个列了!'
return -1
end
--------------------------------------------------
--保证该表的colid是连续的
select @colid_max = max(colid) from syscolumns where id=object_id(@tablename)

if @colid > @colid_max or @colid < 1
set @colid = @colid + 1
--------------------------------------------------
set @sql = 'alter table '+@tablename+' add '+@colname+' '+@coltype
exec(@sql)

select @colid_max = colid
from syscolumns where id = object_id(@tablename) and name = @colname
if @@rowcount <> 1
begin
raiserror 20003 '加一个新列不成功,请检查你的列类型是否正确'
return -1
end
--------------------------------------------------
--打开修改系统表的开关
EXEC sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE

--将新列列号暂置为-1
set @sql = 'update syscolumns
set colid = -1
where id = object_id('''+@tablename+''')
and colid = '+cast(@colid_max as varchar(10))
exec(@sql)

--将其他列的列号加1
set @sql = 'update syscolumns
set colid = colid + 1
where id = object_id('''+@tablename+''')
and colid >= '+cast(@colid as varchar(10))
exec(@sql)

--将新列列号复位
set @sql = 'update syscolumns
set colid = '+cast(@colid as varchar(10))+'
where id = object_id('''+@tablename+''')
and name = '''+@colname +''''
exec(@sql)
--------------------------------------------------
--关闭修改系统表的开关
EXEC sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE
go


调用方法:
exec addcolumn '表名','新列名','新列类型',加到第几个位置
如:
exec addcolumn 'test','id2','char(10)',2
云中客 2006-07-19
  • 打赏
  • 举报
回复
增加一个职位表
Create Table ZW(zwid int,ZwName varchar(50))

增加一个员工所有职位表
create Table YgZw(YgID char(5),zwid int)
此处两个ID值分别对应员工表和职位表

显示时,如果要把所有的职位显示在一列中,可以创建一个函数
Create Function GetZw(@zw int)
return varchar(200)
AS
Begin
DECLARE @ZwName varchar(200)
Select @ZwName=ZwName from Zw where ZwID=@zw
Return (@ZwName)
END
select ygid,ygname....,getzw(c.zwid) from ygxx a,ygzw b,zw c
where a.ygid=b.ygid and b.zwid=c.zwid

22,207

社区成员

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

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