2012-07-24 91 views
3

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

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”表中的“因素”一栏,如果没有匹配到“35”的任何记录。我怎样才能消除该表返回结果。但我真的更喜欢这种方式的结果格式,因为我想将此返回值用作循环,并在循环中执行其他一些操作。再次

谢谢!

回答

2

此修改到您的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运行多个SQL,但是对于语法取决于您的平台。另外,将结果复制到你的查询工具,并运行它们,如果在s.object_id = c.object_id足够

+0

podiluska:你的SQL的伟大工程!你知道结果是否可以用我提供的SQL相同的方式进行格式化?它只是列出tablesNames ...基本上,我打算循环这些表(具有该值的“versionID”的表),并最终插入一些东西。再次感谢! – 2012-07-24 19:29:08

+0

当然 - 只需编辑字符串以取出你不想要的字段... – podiluska 2012-07-24 19:34:17

+0

这会输出新的查询,我知道运行这些查询的唯一方法是使用游标,是否可以在一个查询中进行查询游标,以防我只想获得列x = y的所有表名称? – BornToCode 2013-11-13 08:55:33

0

选择s.name,c.name从SYS.COLUMNS℃的内部加入SYS.TABLES小号 其中c.name类似'%35%'

这会给你带有35和相关表的列。

+0

我正在寻找一个脚本,它将返回具有该“versionID”的表格,并且“versionID”列的值为“35”您的脚本只返回列表为35的表格:) – 2012-07-24 19:30:57

0

申报@tablename VARCHAR(100),@colName VARCHAR(100)声明 @sqlStatement为nvarchar(100)

声明tablelist光标选择s.name,从SYS.COLUMNS Çc.name上s.object_id = c.object_id内部联接SYS.TABLES S其中c.name LIKE '%YourSearchCondtion%' OPEN tablelist FETCH NEXT FROM tablelist 成@tablename,@colName

而@@ FETCH_STATUS = 0 BEGIN

SELECT @sqlStatement = 'SELECT' + @colName + '* FROM '+ @tablename +',其中 '+ @colName +' NOT LIKE'%35% '''

EXEC sp_executesql的@sqlStatement

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

NEXT来去tablelist INTO @tablename,@colName END

CLOSE tablelist DEALLOCATE tablelist GO

+0

我认为这是您所期待的。可能不准确,但你可以调整它,我希望 – isakavis 2012-07-25 13:15:17

相关问题