我正在尝试创建一个简单的脚本来将复杂视图的结果转储到表格中以进行报告。我使用了同义词来简化对视图和表名的调整。
这个想法是,脚本的用户可以将他们想要用作源的视图的名称以及目标报告表的名称放在开始和离开时的名称中。如果表不存在,那么脚本应该创建它。如果表已经存在,那么脚本应该只复制视图中尚未在表中的记录。
下面的脚本涵盖了所有这些要求,但我找不到检查同义词后面的表是否已经存在的好方法:
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 方法可以让我检查同义词后面的表是否存在?还是用完全不同的方式来解决问题?