SQL Server:检查表列是否存在并删除行

SQL Server:检查表列是否存在并删除行,sql,sql-server,Sql,Sql Server,我目前正在编写一个通用的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_N

我目前正在编写一个通用的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”无效

也许我的方法是错误的。有人能给我指一下正确的方向吗?

试试这个-

DECLARE 
       @Column SYSNAME = 'COL1'
     , @Table SYSNAME = 'dbo.TAB1'
     , @SQL NVARCHAR(MAX) 

IF EXISTS (
     SELECT 1
     FROM sys.columns c
     WHERE c.[object_id] = OBJECT_ID(@Table)
          AND c.name = @Column
) BEGIN

     SELECT @SQL = '
          DELETE TAB1 
          WHERE COL1 NOT IN (SELECT COL2 FROM TAB2)'

     EXEC sys.sp_executesql @SQL

END

问题是,SQL Server希望在执行任何批处理之前编译整个批处理

它无法编译批处理,因为缺少一列

因此,您必须确保批处理可以在不编译
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#背景,原始查询就像执行两个反射调用来确定某个类型是否具有特定属性,然后在该类型的对象上有一行代码直接使用该属性-如果该类型没有该属性,代码将不会编译,因此,反射检查永远不会有机会执行。

在这里进行检查以获得更简洁的方式:它就像
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')