1

SQL Server 2005 データベースを使用しています。同じデータ セットに対して、begin...end ブロックで実行されるアクションに応じて、2 つの異なる方法で動作する If ステートメントがあります。

まず、単にコンソールに出力したい場合、次のコードは期待どおり何も出力しません。

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 に存在する場合でも、insert ステートメントは常に起動します。T-SQL 2005 の挿入ステートメントについて、この動作を引き起こしている可能性のある特別なことがありますか、それとも明らかな何かが欠けていますか? コードのロジックが間違っているかどうかは理解できますが、print ステートメントを使用してテストしたところ、期待どおりに動作しました。

編集:「挿入エラー」メッセージを生成します。

この苛立たしい問題の助けをいただければ幸いです。

4

1 に答える 1

2

それはそれを混乱させる Exists..Select の 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

また、括弧と 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 に答える