根据数据库状态创建动态 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 视图的主要内容,如果未能解决你的问题,请参考以下文章