我目前正在编写一个通用的SQL Server脚本,以清理具有更多/更少相同表结构的不同数据库。此脚本要求我擦除表中的某些数据(如果该表存在于数据库中)。这里是脚本示例
IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TAB1') IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TAB1' AND COLUMN_NAME = 'COL1') delete TAB1 where COL1 not in (select COL2 from TAB2);
作为程序员,我知道如果两个条件块都为false,则不会执行delete命令。但是,当我在SQL中运行它时,它会返回
无效的列名“ COL1”。
我的方法可能是错误的。谁能指出我正确的方向?
问题是,SQL Server要在执行任何批处理之前先编译整个批处理。
而且它不能编译批处理,因为缺少列。
因此,您必须确保在不尝试编译DELETE语句的情况下就可以编译该批处理-因此请将其保留为字符串并强制将其分别编译:
DELETE
IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TAB1') IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TAB1' AND COLUMN_NAME = 'COL1') EXEC sp_executesql 'delete TAB1 where COL1 not in (select COL2 from TAB2);'
你说:
作为程序员,我知道如果两个条件块都为false,则不会执行delete命令。
假设有一个C#背景,您的原始查询就像执行两次反射调用来确定某个类型是否具有特定属性,然后有一行代码直接在该类型的对象上使用该属性-如果该类型没有“T 拥有 的属性,代码是不会编译,所以反射检查永远没有机会执行。