declare @str varchar(100)
set @str='006252'  --精确查找 要搜索的字符串 ,这里改成搜索 数值 就不对了,或者没有结果了!咋办?declare @s varchar(8000)
declare tb cursor local for
    select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ @str+''' ) print '' ['+b.name+'].['+a.name+']'''
    from syscolumns a join sysobjects b on a.id=b.id
    where b.xtype='U' and a.status>=0
        and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
    exec(@s)
    fetch next from tb into @s
end
close tb
deallocate tb
===========这样改就没有搜索结果了!==================
 declare @str numeric(9,0)--改动一、定义为数值
set @str='281481'  --精确查找 要搜索的数值
declare @s varchar(8000)
declare tb cursor local for                       --改动二、强制转换为字符串!哈哈 小的不懂,请大伙赐教!   
    select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ cast( @str as varchar)+''' ) print '' ['+b.name+'].['+a.name+']'''
    from syscolumns a join sysobjects b on a.id=b.id
    where b.xtype='U' and a.status>=0
        and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
    exec(@s)
    fetch next from tb into @s
end
close tb
deallocate tb

解决方案 »

  1.   

    引号的问题吧?print出来你的语句,看错在哪里?
      

  2.   

    我感觉应该是数据问题,表中是否281481?或者281481前后是否有空格之类的符号
    我用以下简单的语句模仿了一下,结果一样。楼主仔细检查一下语句吧,或者把表和测试数据发一下declare @str numeric(9,0)
    set @str='123'declare @str1  varchar(100)
    set @str1='123'
    select * from a where name=cast(@str as varchar)
      

  3.   

    select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ cast( @str as varchar)+''')-->select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '+ cast( @str as varchar))
      

  4.   

    糟糕!截图了 居然不能发图!大家随便找个数据库,在查询分析器中就可以测试本代码了!本例中的列名BillNumberId,数据类型numeric,长度9,不允许非空;随便找BillNumberId的一条记录,比如281905;查询分析器中,顺利运行,但就是找不到结果。消息:命令已成功完成。网格:空白!
    正确的话至少应该输出:[BillIndex].[BillNumberId]
    我用上面的存储过程查找字符串是没问题,只要有,就能查到;查数据类型numeric的就不行有没有什么防止空格的tirm函数之类的??建议2楼 可以在自己的数据库随便找个真实值试试;
    3楼,去掉2个''号,会报错的。我不太熟悉存储过程,还望大家赐教!
      

  5.   

    1.你这个搜索好像用不着游标,注意,游标的效率是很差的,不到万不得已不要用.
    2.既然你的数据列是数值,为什么用要字符串的形式来查呢?直接用数值来查试试?
    3.你写的程序,都不是存储过程的格式,如果要写成存储过程,可以类似如下:
    create procedure getdata
    (@BillNumberId int)
    begin
    select * from tb where BillNumberId=@BillNumberId
    end
    go
    4.如果要传入表名来查询,可以类似如下:
    create procedure getdata
    (@BillNumberId int,@tablename)
    begin
    declare @sql nvarchar(max)
    set @str='select * from '+@tablename+' where BillNumberId='+@BillNumberId
    exec(@sql)
    end
    go
      

  6.   

    感谢#5楼    这段代码是网上好不容易寻找到的。经过试验,很好用,因为是用于数据库结构分析,并不是日常使用。2百多个表,百来MB的数据库,4核pc,要运行二十来秒钟就获得结果。慢是慢了点,不过总比没强。^_^   小弟现在也看不懂他的代码。面对楼上兄台的代码还可以看得懂!但面对遍历“所有表”、“所有字段”,列出“出现这个值”的所在字段,就丈二和尚摸不着头脑啦。    若楼上兄台有其它的实现方法!偶是愿闻其详。
      

  7.   

    改成cast( @str as varchar(100))试下呢
      

  8.   

    改成数字有个问题比如006252,如果是decimal,然后用cast转成字符串,那将变成6252,而不是006252
      

  9.   

    CREATE PROC sp_ValueSearch
    @value sql_variant,  --要搜索的数据
    @precision bit=1     --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
    AS
    SET NOCOUNT ON
    IF @value IS NULL RETURN--数据类型处理
    SELECT xtype INTO #t FROM systypes
    WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')--扩展数据类型及查询处理语句
    DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
    IF @precision=1
        SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
            WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
            WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
            ELSE N'=@value' END
    ELSE
    BEGIN
        SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
        IF @sql LIKE N'%char' or @sql LIKE N'%text'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%char' or name LIKE N'%text'
            SELECT @sql=N' LIKE N''%''+CAST(@value as '
                +CASE 
                    WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
                    ELSE 'varchar(8000)' END
                +N')+N''%'''
        END
        ELSE IF @sql LIKE N'%datetime'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%datetime'
            SET @sql=N'=@value'    
        END
        ELSE IF @sql LIKE N'%int' 
            OR @sql LIKE N'%money' 
            OR @sql IN(N'real',N'float',N'decimal',N'numeric')
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%int' 
                OR name LIKE N'%money' 
                OR name IN(N'real',N'float',N'decimal')
            SET @sql=N'=@value'    
        END
        ELSE
            SET @sql=N'=@value'
    END
    --保存结果的临时表
    CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))DECLARE tb CURSOR LOCAL
    FOR
    SELECT N'SELECT * FROM '
        +QUOTENAME(USER_NAME(o.uid))
        +N'.'+QUOTENAME(o.name)
        +N' WHERE '+QUOTENAME(c.name)
        +@sql,
        N'INSERT # VALUES(N'+QUOTENAME(o.name,N'''')
        +N',N'+QUOTENAME(c.name,N'''')
        +N',N'+QUOTENAME(QUOTENAME(t.name)+CASE 
            WHEN t.name IN (N'decimal',N'numeric')
            THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
            WHEN t.name=N'float'
                OR t.name like N'%char'
                OR t.name like N'%binary'
            THEN N'('+CAST(c.prec as varchar)+N')'
            ELSE N'' END,N'''')
        +N',@sql)'
    FROM sysobjects o,syscolumns c,systypes t,#t tt
    WHERE o.id=c.id
        AND c.xusertype=t.xusertype
        AND t.xtype=tt.xtype
        AND OBJECTPROPERTY(o.id,N'IsUserTable')=1OPEN tb
    FETCH tb INTO @sql,@sql1
    WHILE @@FETCH_STATUS=0
    BEGIN
        SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
        EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
        FETCH tb INTO @sql,@sql1
    END
    CLOSE tb
    DEALLOCATE tb
    SELECT * FROM #exec sp_ValueSearch '要搜索的值',1 --1或不输入(即默认值1)精确匹配
    exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配Create   PROC xb_GetTableNameAndColNameForValue
    @value varchar(200)
    AS
    --求test库中包含值为@value的表和列名--存储表名和列名
    IF object_id('tabss') IS NOT NULL 
    exec('drop table tabss')
    CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))--查询某表某列是否包含某个值
    IF object_id('ysgs') IS NOT NULL
    exec('drop proc ysgs')
    exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
    AS
    exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')--将结果存入tabss表中
    EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0  insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
    AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'test'
    GO
    /*调用
    exec xb_GetTableNameAndColNameForValue 'aa_1'
    SELECT * FROM tabss
    */
    Create  PROC  getFieldAll(@t VARCHAR(100),@v VARCHAR(20), @f VARCHAR(1000) OUT )
    AS 
    BEGIN    
        DECLARE @name VARCHAR(40)
        DECLARE @S NVARCHAR(1000),@C INT     
        SET @f='(2006)德旌法协执字第325-1号'
        
        EXEC('declare cur cursor for select name from syscolumns where id=object_id('''+@t+''') and  xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))')
        
        OPEN cur 
        FETCH NEXT FROM cur INTO @name
        WHILE @@FETCH_STATUS=0
        BEGIN
            SET @S='select @s=count(1) from '+@t+' where ['+@name +'] like ''%'+@v+'%'''
            EXEC sp_executesql @S,N'@s int out',@C OUT 
            IF @C>0
                SET @f=@f+@name+','        
            FETCH NEXT FROM cur INTO @name
        END 
        CLOSE cur
        DEALLOCATE cur 
        RETURN 
    END   go
    EXEC sp_msforeachtable 
            @command1 = N'declare @l varchar(1000); exec getFieldAll ''?'',''aa_1'',@l out;if @l<>'''' select ''?'' 表名,@l 列名
            '
      

  10.   

    试试:
    create procedure getdata
    (@BillNumberId varchar(10))
    begin
    declare @billnumberid 
    set @billnumberid='1'
    declare @sql nvarchar(max)
    select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where BillNumberId='''+@BillNumberId+'''' from sys.objects where type='U'
    exec(@sql)
    end
    go
      

  11.   

    改一下:
    create procedure getdata
    (@BillNumberId varchar(10))
    begin
    declare @sql nvarchar(max)
    select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where BillNumberId='''+@BillNumberId+'''' from sys.objects where type='U'
    exec(@sql)
    end
    go
      

  12.   

    我不在公司了,回家过中秋了等一下 装个MSSQL数据库试试,不枉大伙热情!
      

  13.   

    #9楼的兄弟,一来气贯长虹,如滔滔江水!恐怕部分是ctrl+V的吧,呵呵 批查询已完成,但有错误
    资源不足,部分结果已被除去。Create   PROC xb_GetTableNameAndColNameFoValue
        @value varchar(200)
    AS
    --求test库中包含值为@value的表和列名--存储表名和列名
    IF object_id('tabss') IS NOT NULL 
        exec('drop table tabss')
    CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))--查询某表某列是否包含某个值
    IF object_id('ysgs') IS NOT NULL
        exec('drop proc ysgs')
    exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
    AS
    exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')--将结果存入tabss表中
    EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0  insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
    AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'200811'
    GOexec xb_GetTableNameAndColNameFoValue '2011-04-01-PF-0130'
    SELECT * FROM tabss
      

  14.   

    试了一下,9#的也不行!无法在 sysdepends 中添加当前存储过程所对应的行,因为缺少该存储过程所依赖的对象 'sp_ValueSearch'。仍将创建该存储过程。CREATE PROC sp_ValueSearch
    @value sql_variant,  --要搜索的数据
    @precision bit=1     --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
    AS
    SET NOCOUNT ON
    IF @value IS NULL RETURN--数据类型处理
    SELECT xtype INTO #t FROM systypes
    WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')--扩展数据类型及查询处理语句
    DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
    IF @precision=1
        SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
            WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
            WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
            ELSE N'=@value' END
    ELSE
    BEGIN
        SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
        IF @sql LIKE N'%char' or @sql LIKE N'%text'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%char' or name LIKE N'%text'
            SELECT @sql=N' LIKE N''%''+CAST(@value as '
                +CASE 
                    WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
                    ELSE 'varchar(8000)' END
                +N')+N''%'''
        END
        ELSE IF @sql LIKE N'%datetime'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%datetime'
            SET @sql=N'=@value'    
        END
        ELSE IF @sql LIKE N'%int' 
            OR @sql LIKE N'%money' 
            OR @sql IN(N'real',N'float',N'decimal',N'numeric')
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%int' 
                OR name LIKE N'%money' 
                OR name IN(N'real',N'float',N'decimal')
            SET @sql=N'=@value'    
        END
        ELSE
            SET @sql=N'=@value'
    END
    --保存结果的临时表
    CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))DECLARE tb CURSOR LOCAL
    FOR
    SELECT N'SELECT * FROM '
        +QUOTENAME(USER_NAME(o.uid))
        +N'.'+QUOTENAME(o.name)
        +N' WHERE '+QUOTENAME(c.name)
        +@sql,
        N'INSERT # VALUES(N'+QUOTENAME(o.name,N'''')
        +N',N'+QUOTENAME(c.name,N'''')
        +N',N'+QUOTENAME(QUOTENAME(t.name)+CASE 
            WHEN t.name IN (N'decimal',N'numeric')
            THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
            WHEN t.name=N'float'
                OR t.name like N'%char'
                OR t.name like N'%binary'
            THEN N'('+CAST(c.prec as varchar)+N')'
            ELSE N'' END,N'''')
        +N',@sql)'
    FROM sysobjects o,syscolumns c,systypes t,#t tt
    WHERE o.id=c.id
        AND c.xusertype=t.xusertype
        AND t.xtype=tt.xtype
        AND OBJECTPROPERTY(o.id,N'IsUserTable')=1OPEN tb
    FETCH tb INTO @sql,@sql1
    WHILE @@FETCH_STATUS=0
    BEGIN
        SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
        EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
        FETCH tb INTO @sql,@sql1
    END
    CLOSE tb
    DEALLOCATE tb
    SELECT * FROM #exec sp_ValueSearch '55987.5',1 --1或不输入(即默认值1)精确匹配
    --exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配
      

  15.   

    #12楼 的错误更多! 搞不明白了~~  服务器: 消息 156,级别 15,状态 1,过程 getdata,行 3
    在关键字 'begin' 附近有语法错误。
    服务器: 消息 156,级别 15,状态 1,过程 getdata,行 5
    在关键字 'set' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,过程 getdata,行 6
    第 6 行: 'max' 附近有语法错误。
    服务器: 消息 137,级别 15,状态 1,过程 getdata,行 7
    必须声明变量 '@sql'。
    服务器: 消息 137,级别 15,状态 1,过程 getdata,行 8
    必须声明变量 '@sql'。create procedure getdata
    (@totalmoney varchar(10))
    begin
    declare @totalmoney 
    set @totalmoney='127.5'
    declare @sql nvarchar(max)
    select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where totalmoney='''+@totalmoney+'''' from sys.objects where type='U'
    exec(@sql)end
    go
      

  16.   

    试试这个吧! 我亲自试过了,不像楼上的一些人:胡乱丢些代码就不见人踪了;保证能够用!declare @string numeric(9,0)
    set @string='277972'  --精确查找要搜索数值 declare @tbname varchar(50) 
    declare tbroy cursor  for select name from sysobjects  
    where xtype='u'   --第一个游标open tbroy
    fetch next from tbroy into @tbname
    while @@fetch_status=0
    begin
      
     declare @colname varchar(50)
     declare colroy cursor for select name from syscolumns
     where id=object_id(@tbname) and xtype in (
     select xtype from systypes
     where name in ('numeric') --数据类型为数值型
     ) 
     open colroy
     fetch next from colroy into @colname
     while @@fetch_status=0
     begin
     
     declare @sql nvarchar(1000),@j int
     select @sql='select @i=count(1) from ' +@tbname +'  where '+ @colname+' ='+cast(@string as varchar(20))
     exec sp_executesql @sql,N'@i int output',@i=@j output   --输出满足条件表的记录数
     if @j>0
    exec('select  distinct '+@colname+' from ' +@tbname +'  where '+ @colname+' = '+@string )
     fetch next from colroy into @colname --@tbname+'-'+
     end       
     
     close colroy
     deallocate colroyfetch next from tbroy into @tbname
    end
    close tbroy
    deallocate tbroy