Sql Server 动态字段

     在程序设计中,很多时候都涉及到数据字段的不固定,需要动态的增删一些字段

     在这里我介绍一种我自己知道的方法

  步骤:

    1.  首先我们建立一张表,专门用来存储动态字段的详细信息

 1 CREATE TABLE [dbo].[tb_Auto](
 2     [id] [int] IDENTITY(1,1) NOT NULL,  --标识
 3     [tabld_name] [varchar](50) NOT NULL,  --动态字段所属的表格名称
 4     [coloun] [varchar](50) NOT NULL,      --字段名称
 5     [datatype] [varchar](50) NOT NULL,     --字段类型
 6     [length] [int] NULL,                   --字段长度
 7     [isnull] [varchar](10) NOT NULL,       --是否为空
 8  CONSTRAINT [PK_tb_Auto] PRIMARY KEY CLUSTERED 
 9 (
10     [id] ASC
11 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
12 ) ON [PRIMARY]
View Code

 

          2. 当我们需要动态为某个表添加一个字段是 ,只需要在上面的   tb_Auto表中添加一行数据,然后我采用触发器,为要添加字段的表动态添加一个字段

 1 ALTER TRIGGER [dbo].[Trigger_Auto]
 2    ON  [dbo].[tb_Auto] for  insert 
 3 AS 
 4     DECLARE
 5     @tb_Name varchar(50),
 6     @coloun varchar(50),
 7     @datatype varchar(50),
 8     @length varchar(100),
 9     @isnull varchar(10),
10     @sql varchar(200)
11 BEGIN
12     
13     SET NOCOUNT ON;
14 
15     select @tb_Name=tabld_name,@coloun=coloun,@datatype=datatype,@length=[length],@isnull=[isnull] from inserted 
16     if not exists (select * from syscolumns where id=object_id(@tb_Name) and name=@coloun)
17     begin
18         print @length
19          if @datatype='varchar' or @datatype='char' or @datatype='nvarchar' or @datatype='nchar' or @datatype= 'binary' 
20              or @datatype='varbinary' or @datatype='decimal' or @datatype='numeric'
21             set @sql='ALTER table '+@tb_Name+' add '+@coloun+' '+@datatype+'('+@length+') '+@isnull
22          else
23             set @sql='ALTER table '+@tb_Name+' add '+@coloun+' '+@datatype+' '+@isnull
24         print @sql
25         exec (@sql)
26     end
27 
28 END
View Code

 

         3.  同理,如果需要动态删除,也可以建立一个删除的触发器 ,当删除  tb_Auto中的某一行时,删除这一行所对应的表中的对应字段

 

   以上方法仅代表我的个人意见,当然大大们肯定会有更加好的方法,在这里,请大家多多指点!!!

posted @ 2013-07-08 17:56  程小胜  阅读(613)  评论(0)    收藏  举报