Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用动态表名从大量表中进行SQL查询_Sql_Sql Server - Fatal编程技术网

使用动态表名从大量表中进行SQL查询

使用动态表名从大量表中进行SQL查询,sql,sql-server,Sql,Sql Server,我有一个数据库,其中包含自2009年以来每个月的日志。每个表名都遵循以下模式: dbo.LOG[年][月]->dbo.LOG200909 现在我需要合并所有这些表以从中运行查询。有并没有什么捷径可以做到这一点,而不必将它们逐个合并到硬编码的表名中,比如一系列的名称在将来需要更少的维护?因为这些表一直在添加,我希望查询继续处理新添加的表。 顺便说一下,我对SQL几乎是新手。您可以使用存储过程: DECLARE myCursor cursor FOR SELECT QUOTENAME(T.

我有一个数据库,其中包含自2009年以来每个月的日志。每个表名都遵循以下模式: dbo.LOG[年][月]->dbo.LOG200909 现在我需要合并所有这些表以从中运行查询。有并没有什么捷径可以做到这一点,而不必将它们逐个合并到硬编码的表名中,比如一系列的名称在将来需要更少的维护?因为这些表一直在添加,我希望查询继续处理新添加的表。
顺便说一下,我对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”只是所有关系数据库使用的查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。