查询数据库中所有 500 多个表的 SELECT 语句以返回值为 james 或 xyz 的所有字段

Posted

技术标签:

【中文标题】查询数据库中所有 500 多个表的 SELECT 语句以返回值为 james 或 xyz 的所有字段【英文标题】:A SELECT statement quering all 500+ tables in a DB to return all field with a value james or xyz 【发布时间】:2015-02-24 20:43:54 【问题描述】:

我想知道是否可以编写一个查询,从数据库的所有表中返回值为 dcf023 的所有字段。字段 dcf023 n 列标题列 xyz。此代码选择所有列 xyz 列,但我需要缩小字段值 = dcf023 而不是列。

--这段代码只返回列而不是字段=--

选择列名、表名

来自 INFORMATION_SCHEMA.COLUMNS

WHERE COLUMN_NAME LIKE '%Sclumnxyz%'

感谢您的帮助。

【问题讨论】:

谈谈标签垃圾邮件......它是哪一个? @Rick:我想他忘了把它标记为“垃圾邮件”;) 你是什么意思我真的不需要开玩笑 如果你觉得这很简单,那么请给我答案。 正如@canon 建议的那样,您需要通过存储过程在您使用的任何RDBMS 中使用动态SQL。 (您已经标记了多个 RDBMS,所以这对我们很有帮助)。 【参考方案1】:

我当然希望这是为了分析而不是您一直想做的事情。这是我为这类事情准备的脚本。您可能需要稍微修改一下以过滤列名,但这应该可以帮助您入门。这将生成一系列您需要复制然后运行的选择语句。

DECLARE @MySearchCriteria VARCHAR(500)
SET @MySearchCriteria = '''10345''' --you do need all these quotation marks because this string is injected to another string.

SELECT 'if exists(SELECT ' + c.columnlist + '] FROM [' + t.name + '] WHERE ' + w.whereclause + ') SELECT ' + c.columnlist + '] FROM [' + t.name + '] WHERE ' + w.whereclause  as SelectStatement
FROM sys.tables t 
CROSS APPLY (
    SELECT STUFF((    
        SELECT '], [' + c.Name AS [text()]
        FROM sys.columns c
        join sys.types t2 on t2.user_type_id = c.user_type_id
        WHERE t.object_id = c.object_id 
            AND c.collation_name IS NOT NULL
            AND c.max_length > 6
            and t2.name not in ('text', 'ntext')
        FOR XML PATH('') 
    ), 1, 2, '' )
) c (columnlist)
CROSS APPLY (
    SELECT STUFF((    
        SELECT ' OR [' + c.Name + '] IN (' + @MySearchCriteria + ')' AS [text()]
        FROM sys.columns c
        join sys.types t2 on t2.user_type_id = c.user_type_id
        WHERE t.object_id = c.object_id 
            AND c.collation_name IS NOT NULL
            AND c.max_length > 6
            and t2.name not in ('text', 'ntext')
        FOR XML PATH('') 
    ), 1, 4, '' )
) w (whereclause)
where c.columnlist is not null
ORDER BY t.name

【讨论】:

这听起来像是有工作至少我的意思是。但是想出很多select语句你怎么让它只提供结果,列和表而不是SELECT [SystemAssignId],[AccountId],[CompOperId],[PrevAcctId] FROM [AcAccountPointer] WHERE [ SystemAssignId] IN ('14348600000000') OR [AccountId] IN ('14348600000000') OR [CompOperId] IN ('14348600000000') OR [PrevAcctId] IN ('14348600000000') 你有几个选择。您可以将结果复制并粘贴到新的查询窗口中以运行它们,或者您可以扩展它以将这些结果作为动态 sql 执行。这种事情只能作为一次性分析或分析的一部分来完成。永远不要定期执行此操作,因为它会非常缓慢。 它收集了很多空列。有没有办法调整它只带来不空的结果? 当然只是在动态 sql 部分的 select 之前添加一个存在。我将编辑我的答案给你看。 我担心的是,如果你不能添加那一点,你就不会真正理解它做得很好。在使用它之前,请确保您了解它的作用。

以上是关于查询数据库中所有 500 多个表的 SELECT 语句以返回值为 james 或 xyz 的所有字段的主要内容,如果未能解决你的问题,请参考以下文章

无法编辑基于多个表的任何查询

Hive:如何显示表的所有分区?

具有多个表的联结表上的 MySQL SELECT 查询

oracle 将表中所有字段拼接成一个字符串给另一个表的一个字段

oracle查询怎么多个表的第一列

Oracle数据库中如何查询一个用户A下面所有的表的信息