gpt4 book ai didi

SQL Server : check if table column exists and remove rows

转载 作者:行者123 更新时间:2023-12-02 18:56:19 24 4
gpt4 key购买 nike

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

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

Invalid column name '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);'

你说:

As a programmer, I know that the delete command will not be executed if both condition block are false.

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

关于SQL Server : check if table column exists and remove rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com