问题:

 
  
  1. 现需要修改sql数据库里面的一个数值,但不记得在哪个位置,哪个表中了。  
  2.  
  3. 求能达到以下效果的查询语句:  
  4. 查出“2010冬至 ”这几个字段所在的表,以及所在的具体位置!  

参见:http://bbs.51cto.com/thread-805274-1.html

解决方案:

利用sysobjects和syscolumns表,用游标遍历所有表的所有varchar字段(一般是这个类型),动态生成sql,然后执行结果,查询记录数是否大于0,如果大于0说明查到,将查到的结果sql打印出来。稍作修改就可以查到结果。

sql: 

  1. DECLARE @id varchar(11), @tname varchar(20), @cname varchar(40),@sql nvarchar(2000),@xusertype varchar(200),@cnt int 
  2. DECLARE objcursor CURSOR FOR   
  3. SELECT id,name 
  4. FROM sysobjects where type='u' 
  5. OPEN objcursor  
  6. FETCH NEXT FROM objcursor   
  7. INTO @id,@tname  
  8. WHILE @@FETCH_STATUS = 0  
  9. BEGIN 
  10.     DECLARE colcursor CURSOR FOR   
  11.     SELECT name,xusertype  
  12.     FROM syscolumns where id=@id  
  13.     OPEN colcursor  
  14.     FETCH NEXT FROM colcursor INTO @cname,@xusertype  
  15.     set @sql='select @cnt=count(*) from '+@tname +' where 1!=1 ' 
  16.     IF @@FETCH_STATUS <> 0   
  17.         set @sql ='' 
  18.     WHILE @@FETCH_STATUS = 0  
  19.     BEGIN 
  20.         if type_name(@xusertype)='varchar'  --如果是其他类型 自己修改或者增加  
  21.             set @sql = @sql+' or ['+ @cname +'] like ''%2010冬至%''' 
  22.       FETCH NEXT FROM colcursor INTO @cname,@xusertype  
  23.     END 
  24.     if charindex('2010冬至',@sql)>0  
  25.         begin 
  26.             --print @sql  
  27.             execute sp_executesql @sql,N'@cnt int output',@cnt=@cnt output 
  28.             if @cnt>0  
  29.                 begin 
  30.                     print @sql  
  31.                     print convert (varchar(10),@cnt) --输出结果>0就是结果  
  32.                 end 
  33.         end 
  34.     CLOSE colcursor  
  35.     DEALLOCATE colcursor  
  36.     FETCH NEXT FROM objcursor   
  37.     INTO @id,@tname  
  38. END 
  39. CLOSE objcursor  
  40. DEALLOCATE objcursor  

结果: 

 
  
  1. select @cnt=count(*) from test where 1!=1  or [f1] like '%2010冬至%' 
  2. 3  

修改为

select * from test where  [f1] like '%2010冬至%'

就能查到具体记录。

目前只想到这个问题,如果有更好办法,欢迎提出。

测试数据sql:

 
  
  1. create table test  
  2. (  
  3.     f1 varchar(200)  
  4. )  
  5.  
  6. insert into test select '2010冬至' 
  7. insert into test select '2010冬至' 
  8. insert into test select '2010冬至' 
  9. insert into test select '1111'