sql - 递归查询在服务器上执行但不在本地执行

标签 sql sql-server database recursion

这是我的设置:我在我的 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);

最佳答案

我不知道为什么这会发生在你身上...... 我的建议是按照以下步骤实现您的目标:

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

你可能会争辩说这是一个冒险的作弊,但让我解释一下: 您可能有一个用户看到的表池和一些系统设置表。这两组表不会链接在一起(如果没有,即使您的递归查询也会对您说,如果您不删除系统设置表,就不可能删除“用户表”)。 所以你可以相信我的逻辑,闭着眼睛截断所有“用户表”

关于sql - 递归查询在服务器上执行但不在本地执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73291697/

相关文章:

mysql - 将两个不同的查询结果添加到一张表中

mongodb - 在 mongodb 中的多个字段上执行不同

sql-server - 每年获取库存余额

SQLl仅将where子句应用于一个字段

SQL 表数十亿个条目 - 寻找性能建议

mysql - 来自八个表的多个 JOIN 和 SELECT 语句

sql - 查询查找所有 FK 约束及其删除规则 (SQL Server)

php - mySQL查询需要统计到一个字段为1的不同字段

android - app "ends"时存储数据

sql - 来自 oracle 数据库的 sql 查询