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

Posted

技术标签:

【中文标题】根据数据库状态创建动态 SQL 视图【英文标题】:Create a Dynamic SQL View based on database state 【发布时间】:2014-07-29 23:10:09 【问题描述】:

在我的 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】:

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

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

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

【讨论】:

根据我关于表很大的注释,如果我使用表值函数,我会担心性能。根据 MS 的文章,当您开始获取数千行数据时,性能会迅速下降,而该表接近 50 万行和 3 打列。您是否有大型数据集和 TVF 的第一手经验?这是我需要考虑的事情,还是您认为它仍然是一个好的解决方案?

以上是关于根据数据库状态创建动态 SQL 视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之视图存储过程触发器函数事务动态执行SQL

为 SQL Server 2008-2014 的备份状态创建视图

如何根据用户查询数据在视图中设置动态“位置”?

mysql----视图

根据气流中 sql 查询的结果创建动态任务

SQL 中特定日期状态的动态数据透视表