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