2013-02-14 108 views
0

我们正在做这样的事情避免视图

create view v1 
as 
select 'tab1' as table_name , * from table1 
union All 
select 'tab2' as table_name , * from table2 
union All 
select 'tab3' as table_name , * from table3 

然后在SP,

declare @var = function_gettablename() 
    select * from v1 where table_name = @var and datetoload = <ActualDate> 

function_gettablename() = gives the table name based on parameters 

datetoload =非聚集索引列这是对mutuallt独家所有的表格。即一个日期将只在一个表中可用

现在的问题是,在执行计划:使用@var使视图查询所有三个表,而不是所需的一个。

有没有一种方法,它应用过滤器,然后应用联合所有,而不是运行union all,然后应用过滤器。

感谢 AB

+1

你能在你的SP做到这一点? '如果@var ='tab1'开始select * from table1 where datetoload = end else if @var ='tab2'begin select * from table2 where datetoload = end else if @var ='tab3'begin select * from table3 where datetoload = end' – 2013-02-14 04:50:01

+0

如果视图的唯一目的是在proc中调用,我认为你最好用动态SQL或者@rs。提示。如果你不知道哪张表有你的日期,但是你有一个这样的功能,这个视图看起来好像有用。 – 2013-02-14 04:50:48

回答

0

请检查这 - :

DECLARE @Var VARCHAR(MAX) 
SET @Var = function_gettablename() 
DECLARE @Sql VARCHAR(MAX) 
DECLARE @ActualDate DATETIME 
SET @ActualDate ='2013/2/14' 

SET @sql = 'SELECT tab1 as '[email protected]+' , * FROM table1 
      WHERE dateload ='[email protected]+ ' UNION ALL 
      SELECT tab2 as '[email protected]+' , * FROM table1 
      WHERE dateload ='[email protected]+' UNION ALL 
      SELECT tab3 as '[email protected]+',* FROM table1 
      WHERE dateload ='[email protected] 

Exec(@Sql) 
+0

感谢您的意见,我们正试图不使用IF语句和动态查询,因为SP非常复杂,这些表的数量可能会增加。 – user192319 2013-02-14 07:26:43

+0

只需添加到上面,寻找一些方法,以便查询视图在查询中应用过滤器,并且不使用不需要的表。 – user192319 2013-02-14 07:27:42

+0

所以问题是基本上有(n)个复杂的SPS尝试从(m)> 3个表中获取数据。表名将来自函数名称。什么是最好的方法 – user192319 2013-02-14 07:29:46