如何在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
相关产品推荐
相关产品推荐

