数据库内容修改!
条件:
现有数据库:A 以及知道数据库中存在一条信息记录:123456 。
问题:
但不知道存放在数据库:A 中的哪些表?以及表中的哪个字段?
想得到的结果:
1:如何才能知道记录:123456,存在数据库哪些表中以及存在表中哪个字段?
2:如何对存在记录:123456中的所有信息进行修改。修改后的信息变为:654321 ?
------解决方案--------------------create table test(id int,code varchar(10))
insert into test select 1, '123456 '
go
select * from test
go
declare @tname varchar(40),@cname varchar(40)
declare @sql varchar(8000)
create table #t(tname varchar(40),cname varchar(40))
declare t_cursor cursor for
select a.name as tname,b.name as cname
from sysobjects a,syscolumns b
where a.id=b.id and a.type= 'U ' and a.name not like '#% '
open t_cursor
fetch next from t_cursor into @tname,@cname
while @@fetch_status=0
begin
set @sql= 'if exists(select 1 from '+@tname+ ' where '+@cname+ '=123456) '+char(13)
+ ' insert into #t values( ' ' '+@tname+ ' ' ', ' ' '+@cname+ ' ' ') '
print @sql
exec(@sql)
fetch next from t_cursor into @tname,@cname
end
close t_cursor
deallocate t_cursor
select * from #t
select @sql= 'update '+tname+ ' set '+cname+ '=654321 where '+cname+ '=123456 ' from #t
exec(@sql)
go
select * from test
drop table test,#t
go
------解决方案--------------------试验用表
create table temp
(A varchar(50),
B varchar(50),
C varchar(50),
D varchar(50),
E varchar(50),
F varchar(50),
G varchar(50)
)
insert into temp
select 'ab ', 'abc ', 'abc ', 'abcd ', '1abcb ', 'ls ', 'dh '
select * from temp
存储过程:根据表名和字符名查出相应字段
create procedure pro_col (@tbl_name varchar(30),@str varchar(10))as
declare @cur_col varchar(30)
declare @sql varchar(1000)
set @sql= ' '
declare cur_col cursor for
select t2.name from sysobjects t1,syscolumns t2 where t1.id=t2.id and t1.xtype= 'u ' and t1.name= ' '+@tbl_name+ ' ' order by t2.name
open cur_col
fetch next from cur_col into @cur_col
while @@fetch_status = 0
begin
declare @flag varchar(50)
select @flag= ' '+@cur_col+ ' '
set @sql=@sql+ ' select ' ' '+@flag+ ' ' ' 列, '+@flag+ ' 值 from '+@tbl_name+ ' where '+@flag+ ' like ' '% '+ ' '+@str+ ' '+ '% ' ' '+ ' union all '--这里用的是like也可以改成=号
fetch next from cur_col into @cur_col
end
set @sql=substring(@sql,1,len(@sql)-10)
print @sql
exec (@sql)
close cur_col
deallocate cur_col
go
查询表中包含 'abc '字符的列名
exec pro_col temp,abc
------------
列 值
B abc
C abc
------解决方案-------------------- declare @tbname nvarchar(200),@colname nvarchar(200),@sql nvarchar(2000)
DECLARE temp_cursor CURSOR
FOR select so.name as tbname,sc.name colname from sysobjects so inner join syscolumns sc on so.id=sc.id where so.xtype= 'u ' and sc.xtype=231
OPEN temp_cursor
FETCH NEXT FROM temp_curs