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_NAME = 'COL1')
delete TAB1 where COL1 not in (select COL2 from TAB2);
作为一名程序员,我知道如果两个条件块都为假,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);'
你说:
作为一名程序员,我知道如果两个条件块都为假,delete命令将不会被执行。
假设一个C#背景,您的原始查询就像执行两个反射调用来确定一个类型是否具有特定属性,然后有一行代码直接在该类型的对象上使用该属性 - 如果该类型没有没有属性,代码不会编译,所以反射检查从来没有机会执行。
试试这个 -
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
链接地址: http://www.djcxy.com/p/94413.html
上一篇: SQL Server : check if table column exists and remove rows