在存储过程中修改表结构的有关问题
在存储过程中修改表结构的问题
http://bbs.csdn.net/topics/390794073?page=1#post-397440448
在数据库版也发了一个,没找到解决方法,来delphi版试试。解决了200分就是你的了。
另外alter table语句已经print出来在查询分析器里执行过没问题。
用的SqlServer 2000,自己写的SQL语句如下,根据提供的参数修改表(删除和添加字段),现在的问题是,在exec里执行的alter table语句,不论删除还是添加字段,都不起作用。也就是执行这个存储过程后,表结构没变化,单独把exec中的alter table语句拿出来执行没有问题。问题出在哪里?有没有别的修改方法?
------解决方案--------------------
执行存储过程和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遍
------解决方案--------------------
这种,可能一次性建一个完整的表结构
然后把旧表的记录里需要的字段一次性导回来
再truncate旧表
最后把新表改名为旧表
效率才是最高的
------解决方案--------------------
oracle 里我这有写过这样的存储过程 执行没有问题, 你这里直接在SQL 里执行这个过程试试
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遍
------解决方案--------------------
这种,可能一次性建一个完整的表结构
然后把旧表的记录里需要的字段一次性导回来
再truncate旧表
最后把新表改名为旧表
效率才是最高的
------解决方案--------------------
oracle 里我这有写过这样的存储过程 执行没有问题, 你这里直接在SQL 里执行这个过程试试