如何在包含具有特定值的列的所有表中查找?

时间:2011-12-09 09:25:04

标签: sql database sql-server-2008

我的目标是从具有特定值的给定列的数据库中查找所有表。 即 我有表1,表2,表3,表4,表5,表6,表7等表。

在这些表中,某些表的列名为“NameID”。现在我想找出列名为'NameID'且值为100的表。

任何人都可以告诉我如何编写SQL查询吗?

4 个答案:

答案 0 :(得分:1)

是的,您可以使用INFORMATION_SCHEMA,它允许MS SQL自我描述。

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'NameID'

答案 1 :(得分:0)

如果您无法列出表格,我怀疑您是否可以在查询中执行此操作。您需要动态创建一个查询(使用您发现的表格,如Paul Alan Taylor所示)。

尝试改编:

http://ubercode.bleakllc.com/2008/11/find-any-value-in-any-database-column.html

如果您已经知道所有包含该列的表,并且该表列表不会更改,那么您可以执行一个简单的查询,如

  Select 'Table1' from table1 where id = 100
  UNION
  Select 'Table2' from table2 where id = 100
  UNION
  ...

UNION会丢弃所有的欺骗行为,所以如果多行的id为100,那么你只需要列出一次表,如果这不是你想要的UNION ALL。

答案 2 :(得分:0)

需要做类似的事情,对我们来说是TransactionID。我拿了Paul Alan Taylor和MakeMinePanacea的建议并添加了一个光标。它快速而肮脏,但适用于1次。

DECLARE @TableName varchar(MAX)
DECLARE @Sql VARCHAR(MAX)
set @Sql = ''
DECLARE @Tables CURSOR

SET @Tables = CURSOR FOR

    SELECT t.Table_Name
    FROM INFORMATION_SCHEMA.COLUMNS c
    JOIN INFORMATION_SCHEMA.TABLES t on c.Table_Name = t.Table_Name
    WHERE COLUMN_NAME = 'TransactionID' and table_type = 'BASE TABLE'

OPEN @Tables
FETCH NEXT
FROM @Tables INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    if len(@Sql) > 0
    BEGIN
        set @SQL = @SQL + ' UNION ALL '
    END

    set @Sql = @Sql + 'SELECT ''' + @TableName + ''' FROM [' + @TableName + '] WHERE transactionid = 100'

    FETCH NEXT
    FROM @Tables INTO @TableName
END
CLOSE @Tables
DEALLOCATE @Tables

exec (@Sql)

答案 3 :(得分:0)

您可以将我的搜索脚本与以下参数一起使用:

SET @SearchStrColumnValue = '100' /* use LIKE syntax */
SET @FullRowResult = 1
SET @SearchStrTableName = 'TABLE%' /* NULL for all tables, uses LIKE syntax */
SET @SearchStrColumnName = 'NameID' /* NULL for all columns, uses LIKE syntax */
SET @SearchStrInXML = 0 /* Searching XML data may be slow */

http://fullparam.wordpress.com/2012/09/07/fck-it-i-am-going-to-search-all-tables-all-collumns/