使用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?