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ステートメントは具体的なテーブルのセットを参照する必要があり、それらのいずれかが存在しない場合、クエリは実行に失敗します.

あなたの問題はもっと根本的なようです。明らかにInvoiceTable、異なる日付の行を持つ正確に 1 つの が概念的に存在する必要があります。これを年ごとに異なる論理テーブルに分離することは、おそらく最適化のために行われたものです(列が異なる場合を除きますが、これは非常に疑わしいです)。

この場合、パーティショニングはこの問題を解決する方法のようです (年/四半期/月ごとに大きなテーブルをパーティショニングするのが標準的な例です)。これにより、InvoiceTable論理的には 1 つのテーブルを持つことができますが、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 のクエリがあることを確認したいようです。これは少し危険です。命名規則を常に維持する必要があります。この場合、'InvoiceTable%' のような table_name の情報スキーマ テーブルをクエリする必要があります。テーブル内のレコードを取得し、固定 SQL を添付するレコードをループします。そして、ここで行われたように動的SQLを実行しますhttp://www.vishalseth.com/post/2008/07/10/Dynamic-SQL-sp_executesql.aspx

于 2012-07-07T10:32:10.920 に答える