使用UNION ALL在SQL Server中创建视图

请考虑下面的例子:

CREATE VIEW VW_YearlySales
AS

SELECT 2011 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2011
UNION ALL
SELECT 2012 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2012
UNION ALL
SELECT 2013 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2013

GO

InvoiceTable2013实际上并不存在,我现在不想创建它,它将在记录2013年的第一张发票时自动创建。

任何人都可以帮助我如何指定一个条件,在执行UNION ALL之前验证表的存在吗?

非常感谢您的帮助。


正如其他人已经正确地说过的,你不能用视图来实现这一点,因为select语句必须引用一组具体的表 - 如果它们中的任何一个不存在,查询将无法执行。

在我看来,你的问题更为根本。 很明显,概念上应该只有一个InvoiceTable ,其中包含不同日期的行。 按年划分出不同的逻辑表格大概是为优化而做的事情(除非列是不同的,我非常怀疑)。

在这种情况下,分区似乎是解决此问题的方法(按照年/季/月划分大型表是典型示例)。 这可以让你在逻辑上有一个单一的InvoiceTable ,但指定SQL Server应该将数据存储在幕后,就好像它是按年分割的不同表。 您可以获得两全其美的效果 - 准确的模型和快速的性能 - 这使得您的视图定义变得简单。


不,据我所知,它不可能在视图中,你必须使用存储过程。 在存储过程中,您可以验证表的存在并根据该表的存在情况,您可以更改SQL。

编辑:

CREATE PROCEDURE GetYearlySales
AS

IF (EXISTS (SELECT *  
                 FROM INFORMATION_SCHEMA.TABLES  
                 WHERE TABLE_NAME = 'InvoiceTable2013')) 
BEGIN 

   SELECT 2011 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2011 
   UNION ALL 
   SELECT 2012 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2012 
   UNION ALL 
   SELECT 2013 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2013

END
ELSE
BEGIN
   SELECT 2011 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2011 
   UNION ALL 
   SELECT 2012 AS YearNo, ProductID, SUM(Amount) FROM InvoiceTable2012
END 

看起来你想每年都有一个表,并且你想确保你有SP的查询而不需要修改SP。 这有点冒险,你必须始终保持命名约定。 在这种情况下,您需要做的是查询table_name的informationschema表,如“InvoiceTable%”。 获取表中的记录,然后遍历附加固定SQL的记录。 然后执行动态SQL,就像它在这里完成http://www.vishalseth.com/post/2008/07/10/Dynamic-SQL-sp_executesql.aspx

链接地址: http://www.djcxy.com/p/61249.html

上一篇: CREATE VIEW in SQL Server using UNION ALL

下一篇: how can one detect a finished resizing operation in JavaFX?