如何使用一个SQL查询从数据库中删除所有外部表?

3

我需要删除所有外部表,因为我需要重新创建一个外部数据源。但是,如果有使用该特定数据源的外部表,则无法删除外部数据源。然而,我不想输入所有表的名称来删除它们。

我在 Stack Overflow 上搜索,实际上没有找到这个特定问题的答案。我找到了一个更一般的问题的答案,可以用来删除所有表,并且能够修改解决方案。我创建了这个问题来记录我能够创建的解决方案,所以如果你对这个特定问题或使用更一般的方式来删除 SQL DB 的元素感到困惑,你可以利用这个解决方案。

1个回答

6

我通过修改Pரதீப்的这个答案的解决方案成功实现了此功能。

DECLARE @sql NVARCHAR(max)=''
SELECT @sql += ' DROP EXTERNAL TABLE ' + QUOTENAME(S.name) + '.' + QUOTENAME(E.name) + '; '
FROM sys.external_tables  E
    LEFT JOIN sys.schemas S
ON E.schema_id = S.schema_id
Exec sp_executesql @sql

然而,这个解决方案虽然大部分时间可以正常工作,但当外部表名中出现意外字符时可能会出错。因此,在评论中由Dan Guzman提供的这种替代方案将是更安全的选择。

DECLARE @SQL nvarchar(MAX) = ( SELECT STRING_AGG(N'DROP EXTERNAL TABLE ' + QUOTENAME(name), N';') + N';' FROM sys.external_tables );
EXECUTE sp_executesql @SQL;

请注意,应使用STRING_AGG代替聚合字符串连接,因为即使它经常有效,但聚合字符串连接可能会产生错误结果。对于您的情况,更好的查询是DECLARE @SQL nvarchar(MAX) = ( SELECT STRING_AGG(N'DROP EXTERNAL TABLE ' + QUOTENAME(name), N';') + N';' FROM sys.external_tables ); EXECUTE sp_executesql @SQL; - Dan Guzman
谢谢,我仔细阅读了关于STRING_AGG的文档,发现它似乎是更好的解决方案。我会把它加入到我的答案中以便更好地展示。 - Yong Jun Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接