在存储过程中修改表结构的有关问题

在存储过程中修改表结构的问题
http://bbs.csdn.net/topics/390794073?page=1#post-397440448
在数据库版也发了一个,没找到解决方法,来delphi版试试。解决了200分就是你的了。

另外alter table语句已经print出来在查询分析器里执行过没问题。

用的SqlServer 2000,自己写的SQL语句如下,根据提供的参数修改表(删除和添加字段),现在的问题是,在exec里执行的alter table语句,不论删除还是添加字段,都不起作用。也就是执行这个存储过程后,表结构没变化,单独把exec中的alter table语句拿出来执行没有问题。问题出在哪里?有没有别的修改方法?


CREATE PROCEDURE [edt_create_demand] 
  @company int,
  @except varchar(20),    --需要排除的字段
  @fields varchar(1024)   --所有字段,field_1,field_2,field_3,....
AS
begin
  declare @field varchar(20)
  declare @demands varchar(20)
  declare @sql varchar(1024)
  declare @name varchar(20)
  declare @start int
  declare @end int
  set @demands = 'eis_demand_' + cast(@company as varchar)
  --判断表是否存在
  if object_id(cast(@demands as nvarchar), N'U') is null
  begin
    set @sql = 'create table ' + cast(@demands as varchar) + ' (' + @except + ' varchar(20) not null, constraint PK_EIS_DEMAND_' 
      + cast(@company as varchar) + ' primary key (' + @except + '))'
    exec(@sql)
  end
  --获取所有列,删除不存在的字段
  select name into ##temp_demand_name from SysColumns where id=Object_Id(cast(@demands as varchar))
  declare cur cursor for select * from ##temp_demand_name
  open cur
  fetch next from cur into @name
  while (@@FETCH_STATUS = 0)
  begin
    if @name != @except
    begin
      set @start = charindex(@name + ',', @fields)
      if @start = 0
      begin
        set @sql = 'alter table [' + @demands + '] drop column [' + @name + ']'
        print @sql
        exec(@sql)
      end
    end
    fetch next from cur into @name
  end
  close cur
  deallocate cur
  drop table ##temp_demand_name

  
  set @start = 1
  set @end = charindex(',', @fields, @start)
  while (@end != 0)
  begin  
    set @field = substring(@fields, @start, @end - @start)
    --判断表中是否存在“field_+数字”的字段,不存在则添加
    if not exists(select * from syscolumns where id=object_id(cast(@demands as varchar)) and name = @field)
    begin
      set @sql = 'alter table [' + @demands + '] add [' + @field + '] varchar(30)'
      print @sql
      exec(@sql)
    end
    set @start = @end + 1
    set @end = charindex(',', @fields, @start)
  end
end
GO


------解决方案--------------------
执行存储过程和sql的权限都是一样的吧?
建表改字段,属于ddl
而一般的増删改是dml

搜到一个例子: http://bbs.csdn.net/topics/10411998
CREATE PROCEDURE dbo.createtbl (@TableName varchar(10)) as
exec('CREATE TABLE ['+@TableName+'] ([title] [varchar](20) NOT NULL)')
go

你是建表没问题,修改结构才不行?
干脆一次性建好所有字段。。。


------解决方案--------------------
增删字段,实际执行时,系统可能会把原有数据来回倒腾的
是不是这种机制决定了不允许存储过程来执行?
也因为这个机制,你一个个字段的修改,可能效率太低:倒腾n遍

通过程序每次发alter的sql,应该能实现吧——也是要倒腾n遍
------解决方案--------------------
引用:
Quote: 引用:

执行存储过程和sql的权限都是一样的吧?
建表改字段,属于ddl
而一般的増删改是dml

搜到一个例子: http://bbs.csdn.net/topics/10411998
CREATE PROCEDURE dbo.createtbl (@TableName varchar(10)) as
exec('CREATE TABLE ['+@TableName+'] ([title] [varchar](20) NOT NULL)')
go

你是建表没问题,修改结构才不行?
干脆一次性建好所有字段。。。


能一次性建好,当然一次性建好了,问题就是在于不能一次性建好啊。需要删除和增加字段,我现在是在delphi里增删字段,但是想通过存储过程实现。


这种,可能一次性建一个完整的表结构
然后把旧表的记录里需要的字段一次性导回来
再truncate旧表
最后把新表改名为旧表
效率才是最高的
------解决方案--------------------
oracle  里我这有写过这样的存储过程 执行没有问题, 你这里直接在SQL 里执行这个过程试试