搜索在某个数据库的表中具有特定值的列名

时间:2012-07-24 19:11:34

标签: sql database-schema

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

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; 

将返回此示例: Query Results

但是,请注意,“AutoAge_Factor”表中的“factor”列没有任何与“35”匹配的记录。如何消除该表返回结果。但我真的更喜欢这种结果的格式,因为我想将这个返回作为一个循环并在循环中做一些其他的东西。

再次感谢!

3 个答案:

答案 0 :(得分:2)

对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,但其语法取决于您的平台。或者,将结果复制到查询工具中并运行它们,如果满足

答案 1 :(得分:0)

  

从sys.columns c inner join sys.tables s中选择s.name,c.name   在s.object_id = c.object_id,其中c.name喜欢'%35%'

这将为您提供35和相关表格的列。

答案 2 :(得分:0)

  

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

     

为sys.columns中的select s.name,c.name声明tablelist游标   c。在s.object_id = c.object_id中的内连接sys.tables,其中c.name   比如'%YourSearchCondtion%'OPEN tablelist FETCH NEXT FROM tablelist   到@tableName,@ colName

     

而@@ FETCH_STATUS = 0 BEGIN

     

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

     

exec sp_executesql @sqlStatement

     

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

     

FETCH NEXT FROM tablelist INTO @tableName,@ colName END

     

CLOSE tablelist DEALLOCATE tablelist GO