我有一个包含三个主要模式的数据库;
- 全球的
- 权限
- 基于客户 ID 号的唯一架构名称(1、2、3、4 等...)
每个客户在所有三个模式中都有对象,具有全局和权限模式对象名称,包含客户 ID 号,后跟一个 _
例子;
[1].[Test]
[Global].[1_Test]
[Permissions].[1_Test]
到目前为止,我已经编写了执行此操作的波纹管脚本,但只保留一个客户数据,而不是多个;
DECLARE @TenantId NVARCHAR(10)
DECLARE @Commands NVARCHAR(MAX)
DECLARE @Statements TABLE
(
Commands NVARCHAR(500)
)
SET @TenantId = '686'
INSERT INTO @Statements
EXECUTE (
'SELECT ''DROP TABLE'' + '' '' + ''['' + s.[name] + '']'' + ''.'' + ''['' + t.[name] + '']'' AS ''Commands''
FROM sys.schemas s
JOIN sys.tables t on s.schema_id = t.schema_id
WHERE s.name <> '''+ @TenantId +'''
AND s.name <> ''dbo''
AND t.name NOT LIKE '''+ @TenantId +'_%''
AND t.name NOT IN (''DatabaseVersion'', ''PermissionTypes'')
ORDER BY s.name, t.name' )
SELECT * FROM @Statements
--SET @Commands =(
--SELECT STRING_AGG (CAST([Commands] AS NVARCHAR(MAX)), ' ') FROM @Statements )
--SELECT (@Commands)
我如何转换它以便考虑多个 ID,除了一个?我觉得我需要在这里使用光标,但不确定它的结构。
提前致谢。
我已经破解了!以为我会分享以防其他人也有兴趣。
找到这篇文章:从数据库命令中删除所有表,除了命名的少数
它包括一个光标,经过一些修改,我能够满足我的需要。