搜索数据库时需要帮助。因此,我们遇到了这个问题,我们需要知道所有表,其column_name为``sysmodified'',并查看在特定日期(2019年9月25日)之前是否有任何条目。
我试图在google和stackoverflow上找到答案,但是我要么得到一个答案,如何在1个表Example1中的25-sep之前获取结果,要么得到如何获取具有此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(如果可能的话)。
答案 0 :(得分:1)
这是相当简单的动态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
答案 1 :(得分:1)
GMB的评论是正确的。我想到答案的最快方法是使用动态SQL。
我将建立一个查询来遍历或创建具有该列的所有表的联合选择语句。像这样:
(骨架)
price = Replace(price, ".", "_")
price = Replace(price, ",", ".")
price = Replace(price, "_", ",")
因此,以上可能有效。可能需要清理一下,但这是一个基本的想法。