8

请考虑以下示例:

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吗?

非常感谢您的帮助。

4

3 回答 3

3

正如其他人所说的那样,您无法通过视图实现此目的,因为 select 语句必须引用一组具体的表 - 如果其中任何一个表不存在,查询将无法执行。

在我看来,您的问题更为根本。显然,在概念上应该正好是 one InvoiceTable,不同日期的行。按年份将其分成不同的逻辑表可能是为了优化而进行的(除非列不同,我非常怀疑)。

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

于 2012-08-29T11:43:01.177 回答
1

不,据我所知,这是不可能的,您必须使用存储过程。在存储过程中,您可以验证表的存在性,并且根据该表的存在性,您可以更改 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 
于 2012-07-07T10:06:08.063 回答
0

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

于 2012-07-07T10:32:10.920 回答