基于数据库状态创建动态SQL视图

基于数据库状态创建动态SQL视图,sql,sql-server-2008,view,Sql,Sql Server 2008,View,在我的MSSQLServer2008上,我有一个数据库表,它接收一个我无法从庞大的外部数据源控制的提要。此表用于许多生产过程。在feed期间,整个表被截断,然后每小时重新填充一次。该过程只需要5-10秒,但使用该数据的基于web的过程偶尔会出现打嗝 我有另一个表,它与被替换数据的结构相同,反映了上次成功提要中数据的最后一个良好快照。为了在没有大量杂技的情况下解决这个问题,我想创建一个视图,如果主表已填充,则指向主表;如果主表未填充,则指向最后一个良好快照的阴影/克隆表 关于如何解决这个问题,我尝

在我的MSSQLServer2008上,我有一个数据库表,它接收一个我无法从庞大的外部数据源控制的提要。此表用于许多生产过程。在feed期间,整个表被截断,然后每小时重新填充一次。该过程只需要5-10秒,但使用该数据的基于web的过程偶尔会出现打嗝

我有另一个表,它与被替换数据的结构相同,反映了上次成功提要中数据的最后一个良好快照。为了在没有大量杂技的情况下解决这个问题,我想创建一个视图,如果主表已填充,则指向主表;如果主表未填充,则指向最后一个良好快照的阴影/克隆表

关于如何解决这个问题,我尝试了两种方法,但两种方法都无法奏效。使用增量更新不是一个可行的选项,因为更新修改的记录所需的时间比完成更改所需的1小时要长。这只是假设在5到10秒的窗口更新中是一个创可贴,所以所有的查询都可以引用一个活生生的抽象视图来消除复杂性。p> 有没有办法对付这个怪物

方法A

使用存储过程,我可以很容易地做到这一点

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE sp_v_feed
AS
BEGIN
        IF (
                (SELECT COUNT(F.asset_tag) AS records FROM feed F)
                >
                (SELECT COUNT(FS.asset_tag) AS records FROM feed_shadow FS) 
            )  AND (
                (SELECT COUNT(F.asset_tag) AS records FROM feed F) < 80000
            )       
            SELECT * FROM feed_shadow;      
        ELSE
            SELECT * FROM feed;
END
GO
方法B

仅创建视图的另一种方法似乎也不起作用:

CREATE VIEW v_feed 
    IF (
            (SELECT COUNT(F.id) AS records FROM feed F)
            >
            (SELECT COUNT(FS.id) AS records FROM feed_shadow FS) 
        )  AND (
            (SELECT COUNT(F.id) AS records FROM feed F) < 10000000
        )       
        SELECT * FROM feed_shadow;      
    ELSE
        SELECT * FROM feed;

我认为一个表值函数可以满足您的需求

看看Cade Roux对这个问题的回答:


如果您不熟悉表值函数,可以像查询视图一样查询表值函数

根据我关于表太大的注释,如果使用表值函数,我会担心性能。根据MS的文章,当您开始获取数千行数据时,性能似乎会迅速下降,而此表接近500k行和36列。您是否有使用大型数据集和TVF的第一手经验?这是我需要考虑的还是你认为它仍然是一个好的解决方案?
CREATE VIEW v_feed 
    IF (
            (SELECT COUNT(F.id) AS records FROM feed F)
            >
            (SELECT COUNT(FS.id) AS records FROM feed_shadow FS) 
        )  AND (
            (SELECT COUNT(F.id) AS records FROM feed F) < 10000000
        )       
        SELECT * FROM feed_shadow;      
    ELSE
        SELECT * FROM feed;