【问题标题】:Search column name having specific value in tables in certain database在某个数据库的表中搜索具有特定值的列名
【发布时间】:2012-07-24 19:11:33
【问题描述】:

有什么方法可以搜索具有特定值的列,我试图通过数据库中的所有表来查找? 例如我有

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%VersionID%'
ORDER BY schema_name, table_name; 

我从搜索中找到的。它为我提供了“versionID”列存在的表名,但我如何搜索以返回例如该列值为“35”的表名。

提前致谢,


我很抱歉,也许我的要求并不清楚。也许这不能在 SQL 中完成,因为我没有通过我的研究发现任何东西。但让我澄清一下。

运行这个脚本

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%factor%'
--and table_name in (Select name from sysobjects where ratingVersionID = 35)
ORDER BY schema_name, table_name; 

例如会返回这个:

但是假设“AutoAge_Factor”表中的“因子”列没有任何与“35”匹配的记录。我怎样才能从返回的结果中消除该表。但我真的更喜欢这样的结果格式,因为我想将此返回用作循环并在循环中执行一些其他操作。

再次感谢!

【问题讨论】:

    标签: sql database-schema


    【解决方案1】:

    对你的 sql 的修改会生成更多你可以运行的 SQL

    SELECT 
        'select '''+SCHEMA_NAME(schema_id) +'.'+t.name + ''', '+c.name + ' from ' 
          + SCHEMA_NAME(schema_id) +'.' + t.name
          + ' where ' + c.name + ' = 35'
    
    FROM sys.tables AS t 
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
    WHERE c.name LIKE '%ID%' 
    ORDER BY schema_name(schema_id), t.name
    

    如有必要,您可以使 SQL 自动运行,但其语法取决于您的平台。或者,将结果复制到您的查询工具中并运行它们,如果足够的话

    【讨论】:

    • podiluska:你的 SQl 效果很好!你知道结果是否可以像我提供的 SQL 一样格式化?它只列出表名......基本上,我打算遍历这些表(具有该值的“versionID”的表)并最终插入一些东西。再次感谢!
    • 这输出新查询,我知道运行这些查询的唯一方法是使用游标,是否可以在没有游标的情况下在一个查询中进行,以防我只想获取所有表名x=y 列?
    【解决方案2】:

    select s.name, c.name from sys.columns c inner join sys.tables s on s.object_id = c.object_id where c.name like'%35%'

    这将为您提供具有 35 的列和关联的表。

    【讨论】:

    • 我正在寻找一个脚本,该脚本将返回具有该“versionID”的表,并且“versionID”列的值为“35”您的脚本只返回列为 35 的表:)跨度>
    【解决方案3】:

    声明@tableName varchar(100),@colName varchar(100) 声明 @sqlStatement nvarchar(100)

    声明tablelist cursor for select s.name, c.name from sys.columns c inner join sys.tables s on s.object_id = c.object_id where c.name like'%YourSearchCondtion%' OPEN tablelist FETCH NEXT FROM tablelist 进入@tableName,@colName

    而@@FETCH_STATUS = 0 开始

    SELECT @sqlStatement = 'SELECT' + @colName + ', * FROM ' + @tableName + ' WHERE ' + @colName + ' 不喜欢 ''%35%'''

    exec sp_executesql @sqlStatement

    -- 在这里你可以得到你不想要的表并添加到一个临时表中.. PRINT CAST(@@ROWCOUNT AS VARCHAR)

    FETCH NEXT FROM tablelist INTO @tableName, @colName END

    关闭表列表 DEALLOCATE 表列表 GO

    【讨论】:

    • 我认为这是您所期望的。可能不准确,但我希望你可以调整它
    猜你喜欢
    • 2010-12-29
    • 2018-03-17
    • 2022-06-10
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多