这是我的设置:我在我的 Windows PC 上使用 SQL Server,我有一个基于 Windows Server 的带有 SQL Server 的服务器...
这里的要点是,我需要开发一个程序来在任何给定时间截断我的数据库中的所有表...要在我的大型数据库(仍在开发和增长中)上执行此操作,我需要一个可以找到的查询所有外键依赖层次结构,以便我可以截断查询给出的列表中的所有表...我发现在线递归查询但关键是查询在服务器但不在本地主机上... 查询需要 5(最大)的递归级别,但即使我在查询中指定它(选项(maxrecursion 100))它也不会在本地执行...
这是查询:
WITH dependencies -- Get object with FK dependencies
AS (
SELECT FK.TABLE_NAME AS Obj
, PK.TABLE_NAME AS Depends
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
),
no_dependencies -- The first level are objects with no dependencies
AS (
SELECT
name AS Obj
FROM sys.objects
WHERE name NOT IN (SELECT obj FROM dependencies) --we remove objects with dependencies from first CTE
AND type = 'U' -- Just tables
),
recursiv -- recursive CTE to get dependencies
AS (
SELECT Obj AS [Table]
, CAST('' AS VARCHAR(max)) AS DependsON
, 0 AS LVL -- Level 0 indicate tables with no dependencies
FROM no_dependencies
UNION ALL
SELECT d.Obj AS [Table]
, CAST(IIF(LVL > 0, r.DependsON + ' > ', '') + d.Depends AS VARCHAR(max)) -- visually reflects hierarchy
, R.lvl + 1 AS LVL
FROM dependencies d
INNER JOIN recursiv r
ON d.Depends = r.[Table]
)
-- The final result, with some extra fields for more information
SELECT DISTINCT SCHEMA_NAME(O.schema_id) AS [TableSchema]
, R.[Table]
, R.DependsON
, R.LVL
FROM recursiv R
INNER JOIN sys.objects O
ON R.[Table] = O.name
ORDER BY R.LVL
, R.[Table]
option (maxrecursion 100);
最佳答案
我不知道为什么这会发生在你身上...... 我的建议是按照以下步骤实现您的目标:
- 禁用所有外键约束:
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
- 然后执行所有你想要的删除操作
- 启用所有外键约束:
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
你可能会争辩说这是一个冒险的作弊,但让我解释一下: 您可能有一个用户看到的表池和一些系统设置表。这两组表不会链接在一起(如果没有,即使您的递归查询也会对您说,如果您不删除系统设置表,就不可能删除“用户表”)。 所以你可以相信我的逻辑,闭着眼睛截断所有“用户表”
关于sql - 递归查询在服务器上执行但不在本地执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73291697/