2011-12-09 57 views
3

我的目标是从数据库中查找具有特定值的给定列的所有表。 即 我有类似于表1,表2,表3,表4,表5,表6,表7等的表格。如何在包含具有特定值的列的所有表中找到?

在这些表格中,某些表格具有列名'NameID'。现在我想找出列名称为'NameID'且值为100的表格。

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

回答

0

如果您不能列出的表,我怀疑你可以在查询做到这一点。你需要动态地创建一个查询(使用Paul Alan发现的表格)。

尝试适应这一点:

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 
    ... 

联盟将扔掉所有的受骗者,所以如果多行具有ID为100,你只能得到一次列出的表,如果这不是你想要的UNION ALL。

+0

值如果表只需要你想要做的表名从table1中选择top 1'Table1'其中id = 100 union ... –

1

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

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

雅那是真实的,但我想有列“填充NameID”其中有100 –

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) 
相关问题