查询数据库中所有 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 的所有字段的主要内容,如果未能解决你的问题,请参考以下文章