无论前面的IF语句的结果如何,为什么Insert语句总是会触发?

时间:2012-07-09 19:46:00

标签: sql-server tsql

我正在使用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语句进行测试时,它会按预期工作。

编辑:它生成“插入错误”消息。

非常感谢任何有关这个令人沮丧的问题的帮助。

1 个答案:

答案 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)