SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
WHERE COLUMN_NAME='Field'可以取出含有某一字段名的所有表名
再到各张表里去找啰。期待更简单的方法。

解决方案 »

  1.   

    select o.name from syscolumns c inner join sysobjects o on c.id=o.id
    where c.name='id' 
                    ~~~~你替换这个就是了, Column Name
      

  2.   

    select o.name from syscolumns c,sysobjects o where c.id=o.id c.name='id'
      

  3.   

    写错了,
    SELECT TABLE_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'Field'
      

  4.   

    TO: tonitu(tonitu) 
     你这方法不行,搜索到的表不全并且有重复表
    TO: CoolSlob
     只想列出表名,并不需要查询表
      

  5.   

    TO: tonitu(tonitu) 
        不好意思没看到你的补充,你与CoolSlob的方法一样均要显示查询表名,
    能不能去除查询表?
      

  6.   

    什么叫“显示查询表名”?可不可以说得具体一点。比如说我用
    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'id'
    查到Master的两张表,dtproperties和sysconstraints,你是不是不想
    要sysconstraints。如果这样的话,你可以试一下
    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'id' AND TABLE_NAME IN
              (SELECT TABLE_NAME
             FROM INFORMATION_SCHEMA.TABLES
             WHERE TABLE_TYPE = 'BASE TABLE')
      

  7.   

    查询表名即视图名, 
    上面的例子中指定了TABLE_TYPE已解决了第一个问题,
    额外问一下,TABLE_TYPE有哪几种类型?谢谢~ 第二个问题:
     如何从搜索到的表中判断该字段是否已有某一值?
     要用游标一个个去搜索吗 ? 有没有简洁的方法?
      

  8.   

    包括BASE TABLE 和 VIEW两种你可以用
    SELECT COUNT(*)
    FROM 表名
    WHERE 字段名=指定值
      

  9.   

    谢了,但用  
    SELECT COUNT(*)
    FROM 表名
    WHERE 字段名=指定值
    必须一个个表进行循环判断,能否对所有表一次性进行判断???
    我的目的很简单,只需知道该字段名的指定值是否已启用,
    至于在哪张表中启用或启用了几次并不重要
      

  10.   

    把所有表名都写上去不就行了,如果有一张表用了,结果就不为0
    SELECT TOP 1 *
    FROM 表名1,表名2...
    WHERE 字段名=指定值这样的话会快一点。你也可以比较一下两者用的时间。
    试试看,把结果告诉我,我还没试过。
      

  11.   

    tonitu(tonitu)的脚本
    SELECT TOP 1 *
    FROM 表名1,表名2...
    WHERE 字段名=指定值不能运行呀!
      

  12.   

    那你用
    select top 1 公用的字段名
    FROM 表名1,表名2...
    WHERE 字段名=指定值
    呢?用count(*)可能会很慢.
      

  13.   

    TO: tonitu(tonitu) 
    这样不行,会出现公用的字段名不明确,需指定属于哪张表
      

  14.   

    那我没辙了,用count(*)吧。 
    用循环也可以呀,说不定比count(*)快。
      

  15.   

    本想找捷径,唉,只好老实一点了,以后等你有辙了通知一声,呵呵,谢谢邮箱: [email protected]
      

  16.   

    给个比较怪异的做法,再sqlserver2000上测试通过。
    declare @columnname varchar(128)
    declare @strsql varchar(8000)
    set @columnname = 'yourcolumn'
    set @strsql = 'select * from ('
    select @strsql = @strsql + 'select ''' + rtrim(a.table_name) + ''' as tablename,count(*) as cnt from ' + rtrim(a.table_name) + ' where ' + @columnname + ' = 0 union ' 
    from information_schema.columns a,information_schema.tables b 
    where a.table_name = b.table_name and b.table_type = 'BASE TABLE' and column_name = @columnnameset @strsql = left(@strsql,len(@strsql) - 5)set @strsql = @strsql + ') as a where a.cnt > 0'
    exec(@strsql)如果你的具有指定字段的表太多,生成的strsql的语句太多,超过8000个字符,我就解决不了了。
      

  17.   


    楼上的思路同tonitu的一致, 
    但由于表的多少是不可知的,因此不能保证会不会超过8000个字符,
    SQL中有没有一种数据类型可以存储比较多的字符??
      

  18.   

    或者select @strsql = @strsql + 'select  ''' + rtrim(a.table_name) + ''' as tablename,count(*) as cnt from ' + rtrim(a.table_name) + ' where ' + @columnname + ' = 1099 union ' 
    from information_schema.columns a,information_schema.tables b 
    where a.table_name = b.table_name and b.table_type = 'BASE TABLE' and column_name = @columnname这语句能否分次写? 每次仅截取一定量的记录,如50条, 下一次再往下取50,如此循环,
    这样的话能保证不会溢出