我正在使用SQL Server 2005数据库,并且我有一个If语句,它针对相同的数据集以两种不同的方式运行,具体取决于要在begin ... end块中执行的操作。
首先,如果我只想打印到控制台,则以下代码不会按预期打印任何内容:
if (not exists(select null from tblControls where Name = 'SOME_CONTROL_NAME'))
begin
print 'control not found'
end
此代码按预期打印'control found':
if (exists(select null from tblControls where Name = 'SOME_CONTROL_NAME'))
begin
print 'control found'
end
但是,如果我将代码更改为:
if (not exists(select null from tblControls where Name = 'SOME_CONTROL_NAME'))
begin
insert into tblControls values (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1)
end
即使tblControls中存在匹配的记录,也会触发插入语句ALWAYS。 T-SQL 2005中的插入语句有什么特别之处可能导致这种行为,还是我错过了一些明显的东西?我会理解代码的逻辑是否错误,但是当我使用print语句进行测试时,它会按预期工作。
编辑:它生成“插入错误”消息。
非常感谢任何有关这个令人沮丧的问题的帮助。
答案 0 :(得分:2)
存在中的NULL。选择令人困惑的东西。尝试:
if (not exists(select * from tblControls where Name = 'SOME_CONTROL_NAME'))
begin
insert into tblControls values (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1)
end
此外,它可以在没有括号和开始/结束的情况下重写:
IF NOT EXISTS (SELECT * FROM tblControls WHERE Name = 'SOME_CONTROL_NAME')
INSERT INTO tblControls VALUES (632, 'NEW_CONTROL_NAME', 'New Control', 1, 1, NULL, 1, 'DataControls.CheckBox', NULL, NULL, 1)