我在 sqlserver 中有事务备份表,并且都有类似的命名约定,就像RECEIVER_CHARGE_LOG_[MONYYYY].
我查询sys.tables
到的 82 个备份表一样
我现在需要表格中日期的最大值和最小值,这样我就可以检查是否有任何数据丢失。
我需要输出像
Table_name,MAX(DATE_TIME),MIN(DATE_TIME)
有没有一种方法可以引用所有表sys.tables
并从主查询的一部分中使用它们。
我在 sqlserver 中有事务备份表,并且都有类似的命名约定,就像RECEIVER_CHARGE_LOG_[MONYYYY].
我查询sys.tables
到的 82 个备份表一样
我现在需要表格中日期的最大值和最小值,这样我就可以检查是否有任何数据丢失。
我需要输出像
Table_name,MAX(DATE_TIME),MIN(DATE_TIME)
有没有一种方法可以引用所有表sys.tables
并从主查询的一部分中使用它们。
使用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'
您可以使用这样的动态 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)
@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 过程模板,因为它更加合理和高效。