当前位置: 首页 > 面试题库 >

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

公良天逸
2023-03-14
问题内容

我目前正在编写一个通用的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语句的情况下就可以编译该批处理-因此请将其保留为字符串并强制将其分别编译:

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
拥有 的属性,代码是不会编译,所以反射检查永远没有机会执行。



 类似资料:
  • 问题内容: 没有标准的方法可以检查MySQL用户是否存在并基于该用户删除它。有什么解决方法吗? 编辑:我需要一种直接的方法来运行此而不抛出错误, 例如 问题答案: 从MySQL 5.7开始,您可以 更多信息:http : //dev.mysql.com/doc/refman/5.7/en/drop- user.html

  • 我需要验证表中是否已经存在列。我的类扩展了CustomTaskChange,因此我的方法接收一个数据库对象作为参数。我可以通过ResultSetObject进行我想要的验证吗?

  • 问题内容: 我有一个嵌入了数据库的桌面应用程序。当我执行程序时,我需要检查特定的表是否存在,如果不存在则创建它。 给我的数据库一个名为conn的Connection对象,我该如何检查呢? 问题答案: 您可以使用可用的元数据: 有关更多详细信息,请参见此处。还要注意JavaDoc中的注意事项。

  • 问题内容: 我想知道是否有一种方法可以检查Redis列表中是否已存在密钥? 我不能使用集合,因为我不想强制唯一性,但是我确实希望能够检查字符串是否确实存在。 问题答案: 您的选择如下: 如果发现并使用并替换它。 与您的个人保持独立 循环浏览直到找到项目或到达末尾。 Redis列表是作为http://en.wikipedia.org/wiki/Linked_list实现的,因此存在局限性。 我认为您

  • 问题内容: 我想编写一个确定子列表是否存在于较大列表中的函数。 有Python函数可以做到这一点吗? 问题答案: 如果您确定输入内容仅包含数字0和1,那么可以转换为字符串: 这样会创建两个字符串,因此它不是最有效的解决方案,但是由于它利用了Python中优化的字符串搜索算法,因此对于大多数用途而言可能已经足够好了。 如果效率非常重要,则可以查看适用于列表的Boyer- Moore 字符串搜索算法。

  • 我需要检查一列是否存在,如果不存在,请添加它。根据我的研究,sqlite似乎不支持是否应该使用语句和case语句。 以下是我目前掌握的情况: 但我得到了一个错误:接近“ALTER”:语法错误。 有什么想法吗?