检查SQL Server中所有表的日期

afdcj2ne  于 2023-01-01  发布在  SQL Server
关注(0)|答案(1)|浏览(135)

我列了大概300张table。
每个表都有日期列INSERT_DATE(类型为Varchar)。
我想确认一下table上的日期是否相同。
比如说-第一张table:
| 插入日期|
| - ------|
| 小行星2022|
| 小行星2022|
| 小行星2022|
第二个表:
| 插入日期|
| - ------|
| 小行星2022|
| 小行星2022|
| 小行星2022|
第三桌:
| 插入日期|
| - ------|
| 小行星20221230|
| 小行星20221230|
| 小行星20221230|
我的查询所需的结果:
| 表名|日期|
| - ------| - ------|
| 第一个_表格|小行星2022|
| 第二_工作台|小行星2022|
| 第三_表格|小行星20221230|
我很困惑如何使它全部"自动",而不是一个一个地查询。
好像我得花很长时间

SELECT TOP 1 INSERT_DATE 
FROM FIRST_TABLE

那么

SELECT TOP 1 INSERT_DATE 
FROM SECOND_TABLE

那么

SELECT TOP 1 INSERT_DATE 
FROM THIRD_TABLE

直到它会得到300表。顺便说一句,每个表将只有和应该只有1个日期。因为该过程是截断插入,所以如果我看到一些表不匹配的日期一样,其他人,我知道该表有一些问题,我必须手动运行它。

soat7uwm

soat7uwm1#

听起来您需要扫描数据库的INFORMATION_SCHEMA以选择所有感兴趣的表,然后构建并执行动态SQL,该SQL查询每个选定的表并将结果进行UNION。
不清楚您想要的是顶部/最大插入日期还是插入日期的不同列表,所以我为这两种类型都提供了SQL模板。
下面将选择所有具有INSERT_DATE列的表,并构建和执行必要的动态SQL。

-- Select tables
DECLARE @SelectedTables TABLE(TableName SYSNAME)
INSERT @SelectedTables
SELECT T.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES T
JOIN INFORMATION_SCHEMA.COLUMNS C
    ON C.TABLE_NAME = T.TABLE_NAME
    AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
WHERE T.TABLE_TYPE = 'BASE TABLE'
AND C.COLUMN_NAME = 'INSERT_DATE'

  -- Define SQL Templates
DECLARE @SqlTemplateMax NVARCHAR(MAX) = 'SELECT TABLE_NAME = <TableNameString>, MAX(INSERT_DATE) AS INSERT_DATE FROM <TableName>
'
DECLARE @SqlTemplateDistinct NVARCHAR(MAX) = 'SELECT DISTINCT TABLE_NAME = <TableNameString>, INSERT_DATE FROM <TableName>
'
DECLARE @UnionAll NVARCHAR(10) = 'UNION ALL
'
DECLARE @OrderBy NVARCHAR(MAX) = 'ORDER BY
    TABLE_NAME,
    INSERT_DATE DESC
'

-- Build dynamic SQL
DECLARE @Sql NVARCHAR(MAX) = (
    SELECT STRING_AGG(
        REPLACE(REPLACE(@SqlTemplateDistinct
            ,'<TableNameString>', QUOTENAME(T.TableName, ''''))
            ,'<TableName>', QUOTENAME(T.TableName))
        , @UnionAll)
    FROM @SelectedTables T
)
SET @Sql = @Sql + @OrderBy

-- Print and Execute dynamic SQL
PRINT @Sql
EXEC (@Sql)

这将生成并执行以下动态SQL:

SELECT DISTINCT TABLE_NAME = 'FIRST_TABLE', INSERT_DATE FROM [FIRST_TABLE]
UNION ALL
SELECT DISTINCT TABLE_NAME = 'SECOND_TABLE', INSERT_DATE FROM [SECOND_TABLE]
UNION ALL
SELECT DISTINCT TABLE_NAME = 'THIRD_TABLE', INSERT_DATE FROM [THIRD_TABLE]
ORDER BY
    TABLE_NAME,
    INSERT_DATE DESC

有关工作示例,请参见this db<>fiddle
注意上面QUOTENAME()函数的用法,它是一个很好的实践,可以确保在将'strings'[identifiers]注入动态SQL时正确转义潜在的特殊字符。
STRING_AGG()函数将生成的SQL片段连接在一起,并由第二个参数分隔(在本例中为UNION ALL)。如果您使用的是不支持STRING_AGG()的旧版本SQL Server,您将需要求助于使用FOR XML hack,它在过去通常用于连接字符串。请参见this db<>fiddle以了解上面的FOR XML版本。

相关问题