繁体   English   中英

查找具有特定列名 + 值小于 X 的所有表

[英]Find all tables with a specific column name + where value is lower than X

我需要帮助来搜索我们的数据库。 所以我们有这个问题,我们需要知道所有表,column_name 为“sysmodified”,并查看在特定日期(2019 年 9 月 25 日)之前是否有任何条目。

我试图在 google 和 stackoverflow 上找到答案,但我要么得到答案 how to get results before 25-sep within 1 table Example1 ,要么得到结果如何获取所有具有此 column_name Example2的表。

使用我到目前为止的代码(见下文),我们知道有 325 个表,其中包含 column_name “sysmodified”。 我可以手动使用示例 1 来获取我的信息,但我希望有一种方法可以通过一个查询来获得我需要的结果。

这是我到目前为止所拥有的:

USE [database2]
GO
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 '%sysmodified%'
ORDER BY schema_name, table_name;

但是,如果我尝试输入 sysmodified < '20190925' 之类的内容。 我收到错误

WHERE c.name LIKE '%sysmodified%'
AND t.sysmodified < '20190925'

或这种方法,这也会导致错误

SELECT t.name AS table_name, sysmodified,

基于(但我不能在 FROM 中添加 325 个列名?)

SELECT
  title,
  primary_author,
  published_date
FROM
  books
WHERE
  title LIKE 'The%'

希望有人可以帮助我解决这个问题。 我们使用 Microsoft SQL Server Management Studio 17(如果可能相关)。

这是相当简单的动态 sql 放在一起。 这应该会产生您正在寻找的结果,因为我了解您的要求。

declare @SQL nvarchar(MAX) = ''

select @SQL = @SQL + 'select distinct TableName = ''' + object_name(object_ID) + ''' from ' + quotename(object_name(object_ID)) + ' where ' + quotename(c.name) + ' < ''20190925'' UNION ALL '
from sys.columns c
where name like '%sysmodified%'

set @SQL = left(@SQL, len(@SQL) - 10) --removes the final UNION ALL

select @SQL
--once you are comfortable that the dynamic sql is correct just uncomment the next line
--exec sp_executesql @SQL

GMB 的评论是正确的。 我能想到的最快方法是使用动态 SQL。

我将构建一个查询来循环遍历或在具有该列的所有表中创建一个联合 select 语句。 就像是:

(骨骼)

DECLARE @N_SQL NVARCHAR(MAX)
Find all tables that have a column with '%sysmodified%'
Build a dynamic query of (union style) from above like:
SET @N_SQL = ''
SELECT @N_SQL = @NSQL + 'UNION SELECT ' [SCHEMA] + '.' + [TABLENAME] + ' AS TABLENAME FROM ' + [SCHEMA] + '.' + [TABLENAME] + ' WHERE ' + [COLUMN] + ' >= '''<DATE>'''

SELECT @N_SQL --just to see what that string looks like
EXEC SP_EXECUTESQL RIGHT(@N_SQL, LEN(@N_SQL) - 5)  --Trimming out the first word "UNION"

所以,上面可能会奏效。 可能需要一些清理,但它是一个骨架的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM