gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:05:12 25 4
gpt4 key购买 nike

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

这个想法是,脚本的用户可以将他们想要用作源的 View 的名称以及目标报告表的名称放在开始和离开的地方。如果该表不存在,则脚本应创建它。如果表已经存在,那么脚本应该只从 View 中复制表中尚不存在的记录。

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

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

关于sql - 如何检查同义词后面的表是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15639907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com