1

単一の行を更新しようとしている単純な SQL クエリがあります。コードはLinq-to-sqlコードからのものです(Profilerを使用して取得しました)が、ソース(L2S)について心配しないでください...それは質問とは無関係です。

ここで、where 句を使用して更新しようとすると、0 行が更新されます。

次にselect、同じwhere clause. 私は単一の結果を返します。よし、データはある。

where clause statementsクエリが最終的に機能するのは、一部をオフにしたときだけです。私はそれを取得しません:(

私は本当にそれを説明することはできません。だから私はこれを示すビデオを作りました。

こちらの YouTube でビデオをご覧ください。

誰でも助けることができますか?それは本当に奇妙です:(

データベースは MS-SQL 2008 です。

- アップデート

実行しようとしているSQL(L2Sからクリーンアップした後)..

update tblBoardPost
    set IsSticky = 1
where IdBoardPost = 1278
    and IdAddress = 212787
    and Subject = N'ttreterte'
    and Banner is null
    and UniqueSubject = N'ttreterte5'
    AND (NOT ([IsAnnouncement] = 1)) 
    AND (NOT ([IsSticky] = 1)) 
    AND (NOT ([IsLocked] = 1)) 
    and IsVisible = 1
    and IdUserModified = 1
    AND [IdNewsArticle] IS NULL
    AND [IdList] IS NULL

(注:はい、NOT(blah = 1))は奇妙ですが、それを作ったのはL2Sです。

更新 2:

ビデオのコードは、トランザクション/ロールバック トランスで実行されています。これは、機能する奇妙なシナリオの1つを実行すると、変更が機能することを意味します..しかし、ロールバックはそれを元に戻します..そのため、2回目に実行すると..元の値がdb行に返されます.

また、ビデオでは、選択クエリは更新クエリとまったく同じではありません..私は非常に多くの順列を(運がなくても)試してきたため..ビデオを作成するまでに..表示するのを忘れていました元のコード。そうは言っても、selectステートメントとupdate / whereステートメントの両方の同じコード(マシンにコピー/貼り付けたとき)は、まったく同じ問題を再現します:(

更新 2 :)

Lieven の要求に従って、コードと結果を示すスクリーンショットを次に示します。

代替テキスト http://img196.imageshack.us/img196/7111/lieven.png

4

2 に答える 2

0

ビデオでは、あなたの選択は次のようになります

and not IsAnnouncement = 1

アップデートの場合とはまったく異なる結果が得られます

and not (IsAnnouncement = 1)

演算子の優先順位の問題に苦しんでいるようです。

編集

クエリが動画で一致していないため、一致したと言っても、次のスクリプトをコピーして貼り付けて、同じ結果が得られるかどうかをお知らせください。(私は、影響を受ける行が異なるとは信じがたいです)

begin tran

select * 
from tblBoardPost      
where 
  IdBoardPost = 1278    
  and IdAddress = 212787    
  and Subject = N'ttreterte'    
  and Banner is null    
  and UniqueSubject = N'ttreterte5'    
  AND (NOT ([IsAnnouncement] = 1))     
  AND (NOT ([IsSticky] = 1))     
  AND (NOT ([IsLocked] = 1))     
  and IsVisible = 1    
  and IdUserModified = 1    
  AND [IdNewsArticle] IS NULL    
  AND [IdList] IS NULL

update tblBoardPost    
  set IsSticky = 1
where 
  IdBoardPost = 1278    
  and IdAddress = 212787    
  and Subject = N'ttreterte'    
  and Banner is null    
  and UniqueSubject = N'ttreterte5'    
  AND (NOT ([IsAnnouncement] = 1))     
  AND (NOT ([IsSticky] = 1))     
  AND (NOT ([IsLocked] = 1))     
  and IsVisible = 1    
  and IdUserModified = 1    
  AND [IdNewsArticle] IS NULL    
  AND [IdList] IS NULL

rollback tran
于 2009-09-25T06:31:38.297 に答える
0

私はあなたのビデオをチェックしました、そしてあなたはあなたがあなたの更新クエリであなたの選択クエリで1つの行を返すのに使用したのと同じSQL条件を試すべきです。ビデオの2つのSQLステートメントの条件は同じではありません。理由はあまり気にしません。彼らはリンゴ同士ではありません。

動作しているWHERE句をコピーして、動作していない句に貼り付けるだけです。

于 2009-09-25T06:35:18.073 に答える