使用动态表名从大量表中进行SQL查询
我有一个数据库,其中包含自2009年以来每个月的日志。每个表名都遵循以下模式: dbo.LOG[年][月]->dbo.LOG200909 现在我需要合并所有这些表以从中运行查询。有并没有什么捷径可以做到这一点,而不必将它们逐个合并到硬编码的表名中,比如一系列的名称在将来需要更少的维护?因为这些表一直在添加,我希望查询继续处理新添加的表。使用动态表名从大量表中进行SQL查询,sql,sql-server,Sql,Sql Server,我有一个数据库,其中包含自2009年以来每个月的日志。每个表名都遵循以下模式: dbo.LOG[年][月]->dbo.LOG200909 现在我需要合并所有这些表以从中运行查询。有并没有什么捷径可以做到这一点,而不必将它们逐个合并到硬编码的表名中,比如一系列的名称在将来需要更少的维护?因为这些表一直在添加,我希望查询继续处理新添加的表。 顺便说一下,我对SQL几乎是新手。您可以使用存储过程: DECLARE myCursor cursor FOR SELECT QUOTENAME(T.
顺便说一下,我对SQL几乎是新手。您可以使用存储过程:
DECLARE myCursor cursor
FOR SELECT QUOTENAME(T.TABLE_SCHEMA)+'.'+QUOTENAME(T.TABLE_NAME) TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES T
WHERE T.TABLE_NAME LIKE 'Log20[0-9][0-9][0-1][0-9]'
AND T.TABLE_SCHEMA = 'dbo'
ORDER BY T.TABLE_NAME;
IF OBJECT_ID('tempdb..#Results','U') IS NOT NULL
DROP TABLE #Results;
CREATE TABLE #Results -- Same structure as Log tables
(
Col1 int,
Col2 nvarchar(20)
-- ,...
);
OPEN myCursor
DECLARE @TABLE_NAME sysname
FETCH NEXT FROM myCursor INTO @TABLE_NAME
WHILE @@FETCH_STATUS = 0 BEGIN
DECLARE @sSql as nvarchar(MAX)
SET @sSql = 'INSERT INTO #Results(col1,Col2, Col2...) '
+ 'SELECT * FROM ' + @TABLE_NAME
EXEC(@sSql);
FETCH NEXT FROM myCursor INTO @TABLE_NAME
END
CLOSE myCursor
DEALLOCATE myCursor
SELECT *
FROM #Results
DROP Procedure IF EXISTS test_procedure;
GO
CREATE PROCEDURE test_procedure
(@prefix Nvarchar(100),
@start_year int,
@start_month int,
@end_year int,
@end_month int
)
AS
BEGIN
declare @sql varchar(8000)
declare @year int
set @year = @start_year + 1
select @sql='select * from ' + @prefix + CAST(@start_year as varchar(10))
WHILE @year <= @end_year
BEGIN
select @sql +=' union ' + @prefix + CAST(@year as varchar(10))
SET @year = @year + 1
END
select @sql
--execute(@sql)
END;
GO
exec test_procedure @prefix = 'abc', @start_year = 2000, @start_month=1, @end_year = 2005, @end_month=1;
DROP程序(如果存在)测试程序;
去
创建过程测试程序
(@前缀Nvarchar(100),
@起始年份,
@起始月整数,
@年底,
@完整月
)
作为
开始
声明@sql varchar(8000)
声明@year int
设置@year=@start\u year+1
从“+@prefix+CAST”中选择@sql='select*(@start\u year作为varchar(10))
虽然@year Nope,但您应该标记您在问题中使用的数据库。您使用的是哪种DBMS产品?“SQL”只是所有关系数据库使用的查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。