根据数据库状态创建动态SQL视图

时间:2014-07-29 23:10:10

标签: sql sql-server-2008 view

在我的MS SQL Server 2008上,我有一个数据库表,它接收一个我无法通过巨大的外部数据源控制的订阅源。该表用于许多生产过程。在饲料期间,整个餐桌被截断,然后每小时重新填充。这个过程只需要大约5-10秒,但是使用这些数据偶尔会对基于Web的进程造成打击。

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

我已经尝试了两个关于如何解决这个问题的想法,但我无法正常工作。使用增量更新不是一个可行的选择,因为更新修改的记录所需的时间比完成更改的时间长1小时。这只是假设是5-10秒窗口向上更新的创可贴,因此所有查询都可以引用一个实时抽象视图来消除复杂性。

关于如何解决这个怪物的任何想法?

方法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

但我如何看待这个? (抛出语法错误)

CREATE VIEW v_feed AS EXEC sp_v_feed

方法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;

1 个答案:

答案 0 :(得分:0)

我认为一个表值函数会让你得到你想要的东西。

看看Cade Roux对这个问题的回答: TSQL - If..Else statement inside Table-Valued Functions - cant go through

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