日期:2014-05-18  浏览次数:20440 次

数据库内容修改!
条件:
        现有数据库: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