複雑なビューの結果をレポート用のテーブルにダンプする簡単なスクリプトを作成しようとしています。ビュー名とテーブル名の微調整を簡単にするために同義語を使用しました。
スクリプトのユーザーは、ソースとして使用するビューの名前と、ターゲットレポートテーブルの名前を最初と最後に入力できるという考え方です。テーブルが存在しない場合は、スクリプトで作成する必要があります。テーブルがすでに存在する場合、スクリプトは、テーブルにまだ存在していないレコードのみをビューからコピーする必要があります。
以下のスクリプトはこれらすべての要件をカバーしていますが、同義語の背後にあるテーブルがすでに存在するかどうかを確認するための良い方法を見つけることができません。
CREATE SYNONYM SourceView FOR my_view
CREATE SYNONYM TargetReportingTable FOR my_table
-- Here's where I'm having trouble, how do I check if the underlying table exists?
IF (SELECT COUNT(*) FROM information_schema.tables WHERE table_name = TargetReportingTable) = 0
BEGIN
-- Table does not exists, so insert into.
SELECT * INTO TargetReportingTable FROM SourceView
END
ELSE
BEGIN
-- Table already exists so work out the last record which was copied over
-- and insert only the newer records.
DECLARE @LastReportedRecordId INT;
SET @LastReportedRecordId = (SELECT MAX(RecordId) FROM TargetReportingTable)
INSERT INTO TargetReportingTable SELECT * FROM SourceView WHERE RecordId > @LastReportedRecordId
END
DROP SYNONYM SourceView
DROP SYNONYM TargetReportingTable
スクリプトのユーザーにテーブル名を「information_schema」行と上部の同義語にコピーさせることができることはわかっていますが、エラーの余地があります。
また、テーブル名を変数に入れてSQLを文字列として公開するなど、不潔なことをすることもできますが、それでは少し気分が悪くなります。
同義語の背後にあるテーブルが存在するかどうかを確認するための優れたエレガントなSQLの方法はありますか?または、問題を解決するためのまったく異なる方法ですか?