You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL WHERE子句中匹配多个值实现多表外键查询

SQL Server 多表外键删除语句生成方案

原有写法问题

  • 声明的@test变量存储的是完整SQL字符串,直接用=做等值匹配既不会执行内部的查询逻辑,也无法实现多值匹配,属于语法逻辑错误。
  • 不需要额外查询INFORMATION_SCHEMA.TABLES做表存在性校验,直接通过系统视图关联筛选即可,性能更高。

可直接运行的正确写法

固定表名场景(最简洁)

直接将WHERE条件的等值匹配改为IN多值匹配即可,无需额外定义变量:

SELECT 
   'ALTER TABLE ['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' AS DropCommand
FROM sys.foreign_key_columns fk
    JOIN sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id
    JOIN sys.schemas sch ON referencingTable.schema_id = sch.schema_id
    JOIN sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id
    JOIN sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id
WHERE 
    referencedTable.name IN ('employee', 'branch', 'branch_supplier')
    -- 如需限定数据库为assign2,追加下方条件即可
    -- AND DB_NAME(referencedTable.database_id) = 'assign2'

动态表名场景(变量传参)

如果需要通过变量统一维护待匹配的表列表,使用表变量存储目标表名即可:

-- 定义表变量存储所有需要查询的被引用表名
DECLARE @TargetTables TABLE (TableName NVARCHAR(200) NOT NULL PRIMARY KEY)
INSERT INTO @TargetTables(TableName)
VALUES ('employee'), ('branch'), ('branch_supplier')

SELECT 
   'ALTER TABLE ['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' AS DropCommand
FROM sys.foreign_key_columns fk
    JOIN sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id
    JOIN sys.schemas sch ON referencingTable.schema_id = sch.schema_id
    JOIN sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id
    JOIN sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id
WHERE referencedTable.name IN (SELECT TableName FROM @TargetTables)

执行上述SQL后查询出的结果,就是所有关联到目标表的外键删除语句,直接复制执行即可完成外键删除操作。

内容的提问来源于stack exchange,提问作者Pasuk Phonsuphee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:48:23