日期:2014-05-18  浏览次数:20832 次

SQL语句 LIKE表名
若现在有1000张表左右,表结构都是一样的 2列,第一列ID,第二列Con,
表名的增长规则是 [2012-01-01]\[2012-01-02]\[2012-01-03],
以日期为表名的,记录公司每天所有人聊天软件聊天记录,
现在我想查 4月份整月
ID为138的人都所有聊天记录该怎么查呢?
不会要union all 30张表吧?
请大家帮帮忙


------解决方案--------------------
拼接动态查询字符串。
------解决方案--------------------
探讨
若现在有1000张表左右,表结构都是一样的 2列,第一列ID,第二列Con,
表名的增长规则是 [2012-01-01]\[2012-01-02]\[2012-01-03],
以日期为表名的,记录公司每天所有人聊天软件聊天记录,
现在我想查 4月份整月
ID为138的人都所有聊天记录该怎么查呢?
不会要union all 30张表吧?
请大家帮帮忙

------解决方案--------------------
提种方法你可以参考下,你可以生成一个作业,每天执行一次,这个作业的作用是生成一张视图,视图是UNION所有表内容并附加日期列信息。

你的表应该也是每天执行一次的作业,所以在作业里添加生成视图的语句就可以了

这样每天作业更新视图内容,而你想查询某一时间段的信息只需要直接从生成的视图里面查询就可以了,不用每次都UNION所有表或者拼接SQL语句了。
举个例子:
SQL code

CREATE TABLE [2012-03-14]
(
    ID INT NOT NULL,
    Con VARCHAR(100) NOT NULL
)

INSERT INTO [2012-03-14]
SELECT 1,'aa' UNION
SELECT 2,'bb' UNION 
SELECT 3,'cc' UNION
SELECT 138,'dd'


CREATE TABLE [2012-03-15]
(
    ID INT NOT NULL,
    Con VARCHAR(100) NOT NULL
)

INSERT INTO [2012-03-15]
SELECT 1,'aa' UNION
SELECT 2,'bb' UNION 
SELECT 3,'cc' UNION
SELECT 138,'dd'


DECLARE @Table TABLE(Id INT IDENTITY(1,1),TableName VARCHAR(100))
DECLARE @Total INT
DECLARE @Line INT
DECLARE @Sql VARCHAR(8000)
DECLARE @TableName VARCHAR(100)

SET @Line = 1


INSERT INTO @Table
SELECT name FROM SYSOBJECTS WHERE name LIKE '20%'

SELECT @Total = MAX(Id)
FROM @Table

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'UV_ShowAllTable')
BEGIN
    DROP VIEW UV_ShowAllTable
END

SET @Sql = 'CREATE VIEW UV_ShowAllTable 
            AS '

WHILE @Line <= @Total
BEGIN

    SELECT @TableName = TableName FROM @Table WHERE Id = @Line
    
    SET @Sql = @Sql + '
                SELECT Id,Con,' + '''' + @TableName + '''' + ' AS Date FROM ' + '[' + @TableName + ']'
    
    IF @Line <> @Total
    BEGIN
        SET @Sql = @Sql + ' UNION '
    END
    
    SET @Line = @Line + 1
    
END

EXEC (@Sql)

SELECT * FROM UV_ShowAllTable
WHERE ID = 138 AND Date BETWEEN '2012-03-01' AND '2012-03-31'

------解决方案--------------------
探讨
谢谢你~这样可以。。。不过有一点。。。
我DECLARE @Sql VARCHAR(8000) 已经改成MAX了。。。可是SQL还是拼接不下。。肿么办呀


------解决方案--------------------
SQL code
--化解字符串不能超过8000的方法二

--常有人提到,用动态生成SQL语句的方法处理数据时,处理语句超长,无法处理的问题  
--下面就讨论这个问题:  

--创建测试数据
if exists (select * from dbo.sysobjects where id = object_id(N '[tb] ') and OBJECTPROPERTY(id, N 'IsUserTable ') = 1)  
drop table [tb]  
GO  

create table tb(单位名称 varchar(10),日期 datetime,销售额 int)  
insert into tb  
select 'A单位 ', '2001-01-01 ',100  
union all select 'B单位 ', '2001-01-02 ',101  
union all select 'C单位 ', '2001-01-03 ',102  
union all select 'D单位 ', '2001-01-04 ',103  
union all select 'E单位 ', '2001-01-05 ',104  
union all select 'F单位 ', '2001-01-06 ',105  
union all select 'G单位 ', '2001-01-07 ',106  
union all select 'H单位 ', '2001-01-08 ',107  
union all select 'I单位 ', '2001-01-09 ',108  
union all select 'J单位 ', '2001-01-11 ',109  

/*要求结果  
日期       A单位 B单位 C单位 D单位 E单位 F单位 G单位 H单位 I单位 J单位    
---------- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------
2001-01-01 100   0     0     0     0     0     0     0     0     0  
2001-01-02 0     101   0     0     0     0     0     0     0     0  
2001-01-03 0     0     102   0     0     0     0     0     0     0  
2001-01-04 0     0     0     103   0     0     0     0     0     0  
2001-01-05 0     0     0     0     104   0     0     0     0     0  
2001-01-06 0     0     0     0     0     105   0     0     0     0  
2001-01-07 0     0     0     0     0     0     106   0     0     0  
2001-01-08 0     0     0     0     0     0     0     107   0     0  
2001-01-09 0     0     0