我在 SQL 中有数百个表,它们以
dbo.exampledata_2024-01-01
等格式命名,并且每周都会创建一个新表。我想根据名称上的日期从最近 12 个表或最近 3 个月中提取所需的数据?这可能吗?
我不完全确定从哪里开始解决这个问题
以下方法利用
information_schema.tables
来查找与给定命名约定匹配的表。请注意,如果表名的最后 10 个字符无法转换为日期,脚本将出错。请仅将以下内容视为您现在采用的多表方法总会产生的复杂性的示例:
DECLARE @DynamicSQL NVARCHAR(MAX) = '';
DECLARE @TableName NVARCHAR(100);
/* alter the next line to adjust the period e.g. 12 weeks, 60 days etc. */
DECLARE @StartDate DATE = DATEADD(MONTH, -3, GETDATE());
DECLARE table_cursor CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'dbo.exampledata_%'
AND CAST(RIGHT(TABLE_NAME, 10) AS DATE) >= @StartDate;
OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DynamicSQL = @DynamicSQL +
'SELECT * FROM ' + @TableName + ' UNION ALL ';
FETCH NEXT FROM table_cursor INTO @TableName;
END
CLOSE table_cursor;
DEALLOCATE table_cursor;
SET @DynamicSQL = LEFT(@DynamicSQL, LEN(@DynamicSQL) - 10); -- Removes the last 'UNION ALL'
EXEC sp_executesql @DynamicSQL;
另请注意,此动态查询是所有表的联合 - 您尚未指定该查询应执行的操作的任何详细信息。