SQL循环遍历所有表并从特定列获取最大值

时间:2016-07-25 03:29:57

标签: sql loops cursor sql-server-2014

我试图创建一个审核表来检查该表的加载日期。

基本上,我想遍历数据库中的所有表并检查特定列 - LoadedDate并返回每个表的该列的最大值

SELECT TABLE_NAME
INTO #TableList 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'LoadedDate'


SELECT MAX(LoadedDate) FROM @TableName -- I guess using a cursor to loop through #TableList

进入结果表

TableName     LoadedDate  
Table 1       2016-06-01
Table 2       2016-07-01
Table 3       2016-06-01

等等。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用此代码,但这会消耗一些时间

SELECT TABLE_NAME,TABLE_SCHEMA
INTO #TableList 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'LoadedDate'

CREATE TABLE #TempResult (TableName VARCHAR(100), MaxDate DATETIME2)

DECLARE @TableName      VARCHAR(100)
        ,@TableSchema   VARCHAR(100)
DECLARE @SqlQuery   NVARCHAR(MAX)

WHILE(EXISTS(SELECT TOP(1) * FROM #TableList))
BEGIN
    SELECT TOP(1) @TableName = TABLE_NAME, @TableSchema = TABLE_SCHEMA FROM #TableList
    DELETE #TableList WHERE TABLE_NAME = @TableName

    SET @TableName = @TableSchema +'.'+ @TableName
    SET @SqlQuery = 'SELECT '''+@TableName+''' AS ''TableName'', MAX(UpdatedDate) AS MaxDate FROM '+ @TableName
    INSERT INTO #TempResult
    EXECUTE sp_executesql @SqlQuery
END


SELECT * from #TempResult

DROP TABLE #TableList
DROP TABLE #TempResult

答案 1 :(得分:0)

也许是一点点动态SQL

Select Table_Name = cast('' as varchar(150))
      ,LoadedDate = GetDate() 
 Into  #TableList 
 Where 1=0

Declare @SQL varchar(max) = '>>>'

Select @SQL = @SQL + SQL
 From (
        Select Table_Name,SQL='Union All Select Table_Name='''+Table_Name+''',LoadedDate=max(LoadedDate) From ['+Table_Name+'] '
         From  INFORMATION_SCHEMA.COLUMNS
         Where column_name Like '%UTC%'  --= 'LoadedDate'
      ) A

Set @SQL = Replace(@SQL,'>>>Union All','Insert Into #TableList ')
Exec(@SQL)

Select * from #TempResult