修改SQL查询:筛选含Item表且business_date≥2018的指定数据库
解决方案:筛选满足所有条件的数据库
要实现你的需求——找出名称以Aug_开头、存在dbo.Item表、表中有business_date列且该列包含2018年及以后数据的数据库,可以通过动态SQL来跨库验证所有条件,具体代码如下:
DECLARE @SQL NVARCHAR(MAX) = N''; -- 为每个符合基础条件的数据库生成检查语句 SELECT @SQL += N' IF EXISTS ( -- 检查Item表是否存在business_date列 SELECT 1 FROM [' + name + '].sys.columns c JOIN [' + name + '].sys.tables t ON c.object_id = t.object_id JOIN [' + name + '].sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = ''dbo'' AND t.name = ''Item'' AND c.name = ''business_date'' ) AND EXISTS ( -- 检查business_date列是否有2018年及以后的数据 SELECT 1 FROM [' + name + '].[dbo].[Item] WHERE business_date >= ''2018-01-01'' ) SELECT ''' + name + ''' AS Database_Name;' FROM sys.databases WHERE name LIKE 'Aug_%' AND state_desc = 'ONLINE' AND HAS_DBACCESS(name) = 1 AND OBJECT_ID(QUOTENAME(name) + '.[dbo].[Item]', 'U') IS NOT NULL; -- 执行生成的动态SQL EXEC sp_executesql @SQL;
代码逻辑说明:
- 第一步:从
sys.databases筛选出基础达标的数据库:名称匹配Aug_%、数据库在线、当前用户有访问权限、存在dbo.Item表。 - 第二步:对每个基础达标的数据库,先通过系统视图
sys.columns验证business_date列是否存在。 - 第三步:直接查询
Item表,确认business_date列包含2018年1月1日及以后的数据。 - 第四步:所有条件都满足时,返回该数据库的名称。
注意事项:
如果business_date是字符串类型而非日期类型,需要添加格式转换来避免错误,比如将查询条件改为:
WHERE TRY_CONVERT(date, business_date) >= '2018-01-01'
内容的提问来源于stack exchange,提问作者Sumathi Ponramar
相关产品推荐
相关产品推荐

