1

我正在使用 SQL Server 2005 数据库,并且我有一个 If 语句,它针对同一数据集以两种不同的方式运行,具体取决于要在 begin...end 块中采取的操作。

首先,如果我只想打印到控制台,下面的代码不会像预期的那样打印任何内容:

if (not exists(select null from tblControls where Name = 'SOME_CONTROL_NAME'))
begin
  print 'control not found'
end

而此代码按预期打印“找到控制”:

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 中存在匹配的记录,插入语句也总是会触发。T-SQL 2005 中的插入语句有什么特别之处可能导致这种行为,还是我遗漏了一些明显的东西?我会理解代码的逻辑是否错误,但是当我使用 print 语句进行测试时,它会按预期工作。

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

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

4

1 回答 1

2

Exists 中的 NULL..Select 让人困惑。尝试:

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

此外,它可以在没有括号和 Begin/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) 
于 2012-07-09T19:48:48.917 回答