如何检查同义词后面的表是否存在
我正在尝试创建一个简单的脚本,以将复杂视图的结果转储到表中以进行报告。我使用同义词简化了视图和表名的调整。
这个想法是脚本的用户可以在开始时输入想要用作源的视图的名称,然后输入目标报告表的名称。如果该表不存在,则脚本应创建该表。如果表已经存在,则脚本应仅从视图中复制表中尚未存在的记录。
下面的脚本满足了所有这些要求,但是我找不到一种很好的方法来检查同义词后面的表是否已经存在:
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方法来检查同义词后面的表是否存在吗?还是一种完全不同的解决问题的方式?
-
不是最优雅的解决方案,但是您可以将
sys.synonyms
表连接到sys.tables
表以检查表是否存在。如果该表不存在,则连接将失败,并且您将获得0行(因此
IF EXISTS
为false)。如果该表确实存在,则连接将成功,并且您将获得1行(且为true):IF EXISTS( SELECT * FROM sys.synonyms s INNER JOIN sys.tables t ON REPLACE(REPLACE(s.base_object_name, '[', ''), ']', '') = t.name WHERE s.name = 'TargetReportingTable') BEGIN -- Does exist END ELSE BEGIN -- Does not exist END
替换
'TargetReportingTable'
为您要检查的任何同义词。