例如,我在数据库中有2个表.例:表T:
declare @t table (name varchar(20),DOB date)
Insert into @t (name,DOB) values ('Mohan','2001-07-19')
Insert into @t (name,DOB) values ('Minu','1998-06-19')
Run Code Online (Sandbox Code Playgroud)
表:TT
declare @tt table (name varchar(20),DOB date)
Insert into @tt (name,DOB) values ('Raju','2010-07-19')
Insert into @tt (name,DOB) values ('Rani','2001-06-19')
Run Code Online (Sandbox Code Playgroud)
现在我有一个Query来获取基于Date类型过滤器的多个表的表名和列名.
SELECT C.TABLE_SCHEMA, c.TABLE_NAME,c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
JOIN sys.objects o ON o.name = c.TABLE_NAME
WHERE o.type = 'U' AND C.DATA_TYPE = 'Datetime'
Run Code Online (Sandbox Code Playgroud)
输出:
T_Schema T_name T_column
dbo T DOB
dbo TT DOB
Run Code Online (Sandbox Code Playgroud)
但是如何获得两个表的最大日期,如下面的输出:
T_Schema T_name T_column Max_dt
dbo T DOB 2001-07-19
dbo TT DOB 2010-07-19
Run Code Online (Sandbox Code Playgroud)
建议我实现这一目标的最佳方法.
这是另一个不使用游标的选项.我怀疑从性能角度来看会更好,因为你仍然需要每行的子查询.但我真的很讨厌游标.我还使用了系统表而不是信息模式视图,因为有时这些视图有点奇怪.https://sqlblog.org/2011/11/03/the-case-against-information_schema-views
declare @SQL nvarchar(max) = N''
select @SQL = @SQL +
N'select SCHEMA_NAME = ''' + QUOTENAME(s.name) + ''', TABLE_NAME = '''
+ QUOTENAME(o.name) + ''', COLUMN_NAME = '''
+ QUOTENAME(c.name) + ''', MaxDate = '
+ '(select MAX(' + QUOTENAME(c.name) + ') from ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ') UNION ALL '
from sys.columns c
join sys.systypes st on st.type = c.system_type_id
join sys.objects o on o.object_id = c.object_id and o.type = 'U'
join sys.schemas s on s.schema_id = o.schema_id
where st.name = 'datetime'
order by s.name
, o.name
, c.name
set @SQL = left(@SQL, len(@SQL) - 10) --removes final UNION ALL
select @SQL
--uncomment below when you are satisfied the dynamic sql is correct
--exec sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)