这是我的设置:我在我的Windows PC上使用SQL SERVER,我有一台在Windows Server上安装了SQL SERVER的服务器...

这里的要点是,我需要开发一个过程来在任何给定时间截断数据库中的所有表……要在我的大型数据库(仍在开发和增长中)上做到这一点,我需要一个可以找到所有外键依赖层次 struct 的查询,这样我就可以截断查询给出的列表中的所有表……我发现recursive查询是在线的,但重点是the query execute on the server but not on localhost...查询需要5(最大)的递归级别,但即使我在查询(option (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);

推荐答案

我不知道为什么这种事会发生在你身上. 我可以建议的是遵循以下步骤来实现你的目标:

  1. 禁用所有外键约束,如下所示:EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
  2. 然后执行您想要的所有删除操作
  3. 使用以下代码启用所有外键约束:exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

你可能会争辩说这是一种冒险的欺骗,但让我解释一下: 您可能有一个用户可以看到的表池和大约system setting个表.这两组表将不会链接在一起(如果您的递归查询也不会告诉您,如果您不删除system setting个表,则不可能删除"用户表"). 这样你就可以相信我的逻辑,闭上眼睛截断所有的"用户表"

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何连接第二个表并将其内容输入到第一个表的单个字段中?

从以前的非空值行中获取值

为什么在postgres中,横向连接比相关子查询快?

PostgreSQL基于2个COLS的任意组合 Select 唯一行

在数据库中搜索列

按日期时间(不包括秒)连接表

在SQL中为两个日期之间的每个日期添加行

SQL计数条目大于日期,包括交叉表中的零

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

根据是否出现过零来筛选数据(跨多行)

更正用于判断错误组合的SQL

最小非重复集的SQL查询

提取连续时间戳范围的SQL

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

替换SQL Server XML中多处出现的 node 值

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

SQL Server: 将JSON对象数组转换为表格格式

自动生成计算频率的列

Teradata 多个进程的最大进程结束时间捕获