SQL

如何检查同义词后面的表是否存在

发布于 2021-04-20 22:39:19

我正在尝试创建一个简单的脚本,以将复杂视图的结果转储到表中以进行报告。我使用同义词简化了视图和表名的调整。

这个想法是脚本的用户可以在开始时输入想要用作源的视图的名称,然后输入目标报告表的名称。如果该表不存在,则脚本应创建该表。如果表已经存在,则脚本应仅从视图中复制表中尚未存在的记录。

下面的脚本满足了所有这些要求,但是我找不到一种很好的方法来检查同义词后面的表是否已经存在:

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方法来检查同义词后面的表是否存在吗?还是一种完全不同的解决问题的方式?

关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-04-20
    为面试而生,有面试问题,就找面试哥。

    不是最优雅的解决方案,但是您可以将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'为您要检查的任何同义词。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看