如何在多个表中获取日期的最大日期值列

moh*_*111 3 sql sql-server

例如,我在数据库中有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)

建议我实现这一目标的最佳方法.

Sea*_*nge 6

这是另一个不使用游标的选项.我怀疑从性能角度来看会更好,因为你仍然需要每行的子查询.但我真的很讨厌游标.我还使用了系统表而不是信息模式视图,因为有时这些视图有点奇怪.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)