当前位置: 首页 > 面试题库 >

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

百里俭
2023-03-14
问题内容

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

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

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

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'为您要检查的任何同义词。



 类似资料:
  • 我是boto3的新用户,我正在使用DynamoDB。 我浏览了dynamodbapi,没有找到任何方法告诉我是否已经存在一个表。 处理这个问题的最佳方法是什么? 我应该尝试创建一个新表并使用try-catch包装它吗?

  • 问题内容: 理论上听起来很简单,但是我已经做了很多研究,但很难弄清楚。 我如何检查MySQL表是否存在以及它是否在执行某些操作。(我猜一个简单的php if / else语句可以解决这个问题) 有没有办法做到这一点? 这是我对cwallenpoole的响应所做的: 问题答案: 诚然,它比Python惯用语言更具有Python风格,但另一方面,您不必担心要处理大量额外数据。 编辑 因此,截至我撰写此

  • 问题内容: 我正在通过.NET应用程序中的ODBC驱动程序连接到Hive。是否存在查询以确定表是否已存在? 例如,在MSSQL中,您可以查询表,而在Netezza中,您可以查询表。 任何援助将不胜感激。 问题答案: 您可以通过两种方法进行检查: 1.)如@dimamah所建议,只需在此处添加一点,对于这种方法,您需要 2.)第二种方法是使用HiveMetastoreClient API,您可以在其

  • 如何检查名称为“session”的表是否存在?我如何知道我的查询是否有效? 编辑:这不是上述问题的重复,因为我的问题与Node.js javascript代码有关。不是SQL!我只想知道在res对象中查找什么,因为它似乎是未定义的...

  • 问题内容: 我有一个嵌入了数据库的桌面应用程序。当我执行程序时,我需要检查特定的表是否存在,如果不存在则创建它。 给我的数据库一个名为conn的Connection对象,我该如何检查呢? 问题答案: 您可以使用可用的元数据: 有关更多详细信息,请参见此处。还要注意JavaDoc中的注意事项。

  • 假设我有一个列表列表。 现在我想检查某一组单词后是否存在单词“is”。 我写了一个单词lise 有没有办法用if语句检查它? 如果我在句子中写< code > if ' is:它将返回List1中的所有三个句子,我希望它返回前两个句子。 有没有办法检查单词' Is '是否正好定位在word_list中的单词之后?提前感谢。