我需要删除所有外部表,因为我需要重新创建一个外部数据源。但是,如果有使用该特定数据源的外部表,则无法删除外部数据源。然而,我不想输入所有表的名称来删除它们。
我在 Stack Overflow 上搜索,实际上没有找到这个特定问题的答案。我找到了一个更一般的问题的答案,可以用来删除所有表,并且能够修改解决方案。我创建了这个问题来记录我能够创建的解决方案,所以如果你对这个特定问题或使用更一般的方式来删除 SQL DB 的元素感到困惑,你可以利用这个解决方案。
我需要删除所有外部表,因为我需要重新创建一个外部数据源。但是,如果有使用该特定数据源的外部表,则无法删除外部数据源。然而,我不想输入所有表的名称来删除它们。
我在 Stack Overflow 上搜索,实际上没有找到这个特定问题的答案。我找到了一个更一般的问题的答案,可以用来删除所有表,并且能够修改解决方案。我创建了这个问题来记录我能够创建的解决方案,所以如果你对这个特定问题或使用更一般的方式来删除 SQL DB 的元素感到困惑,你可以利用这个解决方案。
我通过修改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;
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