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

Posted

技术标签:

【中文标题】SQL Server:检查表列是不是存在并删除行【英文标题】:SQL Server : check if table column exists and remove rowsSQL Server:检查表列是否存在并删除行 【发布时间】:2013-07-09 06:38:57 【问题描述】:

我目前正在编写一个通用 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);

作为程序员,我知道如果两个条件块都为假,删除命令将不会被执行。但是,当我在 SQL 中运行它时,它会返回

列名“COL1”无效。

可能我的方法是错误的。谁能指出我正确的方向?

【问题讨论】:

在这里结帐以获得更简洁的方式:***.com/a/5369176/316343就像COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate') 【参考方案1】:

试试这个 -

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

【讨论】:

【参考方案2】:

问题是,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);'

你说:

作为程序员,我知道如果两个条件块都为假,删除命令将不会被执行。

假设,例如,C# 背景,您的原始查询就像执行两次反射调用以确定一个类型是否具有特定属性,然后有一行代码直接在该类型的对象上使用该属性 - 如果类型没有属性,代码不会编译,所以反射检查永远没有机会执行。

【讨论】:

以上是关于SQL Server:检查表列是不是存在并删除行的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL Server2005数据库中检查一个表是不是存在,如存在就删除表记录,如不存在就建表.

如何使用 JdbcTemplate 检查表列是不是存在?

如何检查 SQL Server CE 3.5 中是不是存在表

Sql Server中判断表列不存在则创建的方法[转]

比较 SQL 中的 Oracle 表列

如何检查Sql server中是不是存在约束?