在 SQL Server 中根据条件创建视图

Posted

技术标签:

【中文标题】在 SQL Server 中根据条件创建视图【英文标题】:Create View based on condition in SQL Server 【发布时间】:2014-10-13 20:03:21 【问题描述】:

这个问题被问了好几次了,但有些东西我想不通。

首先,我需要创建视图(必须是视图),但是根据一个查询的结果。

create view as
if (select count(oid)...)>1
   select1
else
   select2

我知道这种形式是不允许的。但是我怎样才能完成这样的事情呢?我需要创建数十个这样的视图。因为这些 SELECT 语句包含空间条件,并且数据库很大并且有很多很多表,所以我需要“最佳”解决方案,否则它将永远查询。

我阅读了一些关于使用存储过程和 UD 函数的内容,但是如何从它们创建视图并获得最大性能? 我不需要其中的参数,只需创建由该条件定义的视图即可。

【问题讨论】:

为什么它需要是一个视图?存储过程不需要你有参数。你有没有研究过案例陈述? @rhealitycheck 因为我需要将该视图用作其他软件中的源数据集。他只接受表格和视图,所以我无法制作表格,因为大量的数据和表格。在创建视图时,案例如何帮助我(非选择,ofcource)? 【参考方案1】:

您可以让视图调用存储过程。

create view ConditionalView as
execute sp_ConditionalView 

然后将条件代码放入存储过程中。

【讨论】:

你创建了存储过程吗?【参考方案2】:

“最佳解决方案”是 IF 语句。可以说,您尝试做的任何其他事情都不是最佳的。很可能极不理想。所以这排除了视图。

尝试表达条件 2 选择的查询(这是可能的,但不是一个好主意)的问题是查询需要编译到特定的执行计划中。没有“条件”执行计划,该计划必须适用于所有情况。尽管可能 select1 和 select2 每个都有一个最佳执行计划,但在单个 SELECT 中表达它们的查询不会有任何最佳计划。该查询可能会以一个蛮力计划结束,该计划扫描所有表,忽略所有索引。

即使试图用基于多语句表值函数的视图作弊也不太可能奏效(至少效率不高)。只是不要这样做。回到你的设计委员会,尝试设计一些使用你的数据库的东西,而不是与之对抗。

【讨论】:

恐怕不可能改变整个设计。 ://【参考方案3】:

如果您只需要从存储过程创建视图(而不是从视图中实际返回数据),则需要使用动态 SQL:

create proc dbo.makeview as
if (select count(old) > 1 from somthing)
begin
    exec sp_executesql N'create view dbo.view1 as select x from y';
end
else
begin
    exec sp_executesql N'create view dbo.view1 as select a from b';
end;

当然,这样做,如果条件改变,视图不会改变。如果条件以其他方式发生变化,您也许可以管理一些事情,以便重新创建视图。

要更动态地执行此操作,并且如果 select1 和 select2 具有相同的输出列,您可以使用类似

create view dbo.view1 as
with x as (
    select
        case when count(old) > 0 then 0 else 1 end cond
    from
        something
), y as (
    select
        0 as disc,
        rest_of_select1
    union all
    select 
        1,
        rest_of_select2
) select
    col1,
    col2
from
    y 
        inner join
    x
        on x.cond = y.disc
option
    (recompile);

我怀疑它会表现得特别好,但

Example SQLFiddle

【讨论】:

以上是关于在 SQL Server 中根据条件创建视图的主要内容,如果未能解决你的问题,请参考以下文章

sql server创建视图添加where条件,条件包含一个参数

SQL中视图的创建。修改,删除

sql server中,修改视图名字的SQL语句

SQL Server里面啥样的视图才能创建索引

sql2005 中的把2个表创建成一个视图

根据 SQL Server 中给定的条件分配产品名称