问题:
- 现需要修改sql数据库里面的一个数值,但不记得在哪个位置,哪个表中了。
- 求能达到以下效果的查询语句:
- 查出“2010冬至 ”这几个字段所在的表,以及所在的具体位置!
参见:http://bbs.51cto.com/thread-805274-1.html
解决方案:
利用sysobjects和syscolumns表,用游标遍历所有表的所有varchar字段(一般是这个类型),动态生成sql,然后执行结果,查询记录数是否大于0,如果大于0说明查到,将查到的结果sql打印出来。稍作修改就可以查到结果。
sql:
- DECLARE @id varchar(11), @tname varchar(20), @cname varchar(40),@sql nvarchar(2000),@xusertype varchar(200),@cnt int
- DECLARE objcursor CURSOR FOR
- SELECT id,name
- FROM sysobjects where type='u'
- OPEN objcursor
- FETCH NEXT FROM objcursor
- INTO @id,@tname
- WHILE @@FETCH_STATUS = 0
- BEGIN
- DECLARE colcursor CURSOR FOR
- SELECT name,xusertype
- FROM syscolumns where id=@id
- OPEN colcursor
- FETCH NEXT FROM colcursor INTO @cname,@xusertype
- set @sql='select @cnt=count(*) from '+@tname +' where 1!=1 '
- IF @@FETCH_STATUS <> 0
- set @sql =''
- WHILE @@FETCH_STATUS = 0
- BEGIN
- if type_name(@xusertype)='varchar' --如果是其他类型 自己修改或者增加
- set @sql = @sql+' or ['+ @cname +'] like ''%2010冬至%'''
- FETCH NEXT FROM colcursor INTO @cname,@xusertype
- END
- if charindex('2010冬至',@sql)>0
- begin
- --print @sql
- execute sp_executesql @sql,N'@cnt int output',@cnt=@cnt output
- if @cnt>0
- begin
- print @sql
- print convert (varchar(10),@cnt) --输出结果>0就是结果
- end
- end
- CLOSE colcursor
- DEALLOCATE colcursor
- FETCH NEXT FROM objcursor
- INTO @id,@tname
- END
- CLOSE objcursor
- DEALLOCATE objcursor
结果:
- select @cnt=count(*) from test where 1!=1 or [f1] like '%2010冬至%'
- 3
修改为
select * from test where [f1] like '%2010冬至%'
就能查到具体记录。
目前只想到这个问题,如果有更好办法,欢迎提出。
测试数据sql:
- create table test
- (
- f1 varchar(200)
- )
- insert into test select '2010冬至'
- insert into test select '2010冬至'
- insert into test select '2010冬至'
- insert into test select '1111'
转载于:https://blog.51cto.com/oswica/462099