2

我在 sqlserver 中有事务备份表,并且都有类似的命名约定,就像RECEIVER_CHARGE_LOG_[MONYYYY].我查询sys.tables到的 82 个备份表一样

我现在需要表格中日期的最大值和最小值,这样我就可以检查是否有任何数据丢失。

我需要输出像

Table_name,MAX(DATE_TIME),MIN(DATE_TIME)

有没有一种方法可以引用所有表sys.tables并从主查询的一部分中使用它们。

4

3 回答 3

3

使用sp_MSForeachtable您可以使用参数过滤表以将@Whereand其限制为仅以“RECEIVER_CHARGE_LOG_”开头的表:

exec sp_MSforeachtable  
    @command1 = 'select ''?'', MAX(DATE_TIME),MIN(DATE_TIME) from ?', 
    @Whereand = ' and o.name like ''RECEIVER_CHARGE_LOG_%'''

编辑 为了使其更易于使用,您可以插入临时表,然后从中选择:

CREATE TABLE #result
(
    TableName SysName,
    MaxDateTime DateTime,
    MinDateTime DateTime
)

exec sp_MSforeachtable  
    @command1 = 'INSERT INTO #result select ''?'', MAX(DATE_TIME), MIN(DATE_TIME) from ?', 
    @Whereand = ' and o.name like  ''RECEIVER_CHARGE_LOG_%''',
    @postcommand = 'select * from #result;drop table #result'
于 2013-11-13T13:00:59.017 回答
2

您可以使用这样的动态 SQL。您可能需要调整它,因为您没有提供表的确切架构:

declare @sql nvarchar(max) = N'create table #temp(Table_Name nvarchar(max), MaxDate datetime, MinDate datetime); '

select @sql = @sql + 'insert into #temp select ''' + name + ''', MAX(DATE_TIME),MIN(DATE_TIME) from [' + name + ']; ' 
from sys.tables where type = 'U' and name like 'RECEIVER_CHARGE_LOG%'

set @sql = @sql + ' select * from #temp; drop table #temp;'

exec (@sql)
于 2013-11-13T12:06:02.817 回答
1

@Damien_The_Unbeliever:难以置信。我不知道 sp_msforeachtable 有这样的潜力。我总是用 while 循环和大量动态 SQL 来制作这些页面的长脚本。

所以OP,作为一个答案,你可以尝试这样的事情,例如:

编辑

您还可以通过使用临时表来存储结果来获取设置,例如:

IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
   DROP TABLE #TEMP

CREATE TABLE #TEMP (TableName VARCHAR(256) COLLATE DATABASE_DEFAULT, MaxDate DATETIME, MinDate DATETIME)

EXEC SP_msForeachTable 'IF OBJECT_ID(''?'') IN 
(SELECT T.object_id
FROM sys.tables T
JOIN sys.columns C on C.object_id = T.object_id
JOIN sys.schemas S on S.schema_id = T.schema_id
WHERE T.name like ''RECEIVER_CHARGE_LOG_%'' AND C.name LIKE ''DATE_TIME'' 
AND S.name = ''dbo'')
   EXEC(''INSERT INTO #TEMP SELECT ''''?'''' Table_Name, MAX(DATE_TIME) MaxDate, MIN(DATE_TIME) MinDate FROM ?'')'

SELECT * 
FROM #TEMP 
ORDER BY MinDate

虽然我建议您使用 Steve Ford 的 sp_msForEachTable 过程模板,因为它更加合理和高效。

于 2013-11-13T12:22:23.590 回答