2016-07-08 4 views
1

異なるサーバー上の同じデータベースでいくつかのスクリプトを実行しています。サーバー固有のエラー:複数の部分の識別子をバインドできませんでした

スクリプトはそれらのほとんどに正常に実行されますが、一部に私はこのエラーを取得しています:

UPDATE DB.T1 
SET SONUM = 0 
WHERE SONUM <> 0 
    AND NOT EXISTS (
     SELECT SERVICEORDER 
     FROM DB.T2 
     WHERE SERVICEORDER = T1.SONUM 
     ) 

The multi-part identifier T1.SONUM could not be bound

私の質問は、なぜそれがすべてのいくつかのサーバーで正常に動作していないがされて?どうすれば修正できますか?

私はこの1つで上記のクエリを置き換えることができます?:

UPDATE DB.T1 
SET SONUM = 0 
WHERE SONUM NOT IN (
     SELECT SERVICEORDER 
     FROM DB.T2 
     ) 
    AND SONUM <> 0 
+0

あなたは正しい質問を私たちに提示していません。いずれにも「T1.SONUM」はありません。 –

+0

ありがとう、ただ編集しました – Far

+1

最初のステートメントにはどのように複数の「WHERE」節がありますか?また、 "B5"テーブルがどこから来ているのかわかりません。そのステートメントはどのサーバーでも実行できません。構文に間違いがあります。 – EMUEVIL

答えて

0

は、あなたのテーブルの別名を与えます。 T1はスキーマDBにあり、EXISTSはおそらくデフォルトのDBOで表示されているようです。

UPDATE T 
SET SONUM = 0 
FROM DB.T1 T 
WHERE SONUM <> 0 
AND NOT EXISTS (SELECT SERVICEORDER 
       FROM DB.T2 
       WHERE SERVICEORDER = T.SONUM) 

注:

これを試してみてくださいそしてもちろん、選択するために、これを変換し、あなたが更新する前に、正しい結果を得ていることを確認してください。

0

あなたがエラーを取得する可能性がある理由は、あなたのテーブル間の列名との矛盾です。これを実行しているすべてのテーブルに「SONUM」という列が存在する必要があります。

テーブルスキーマを確認した後で、これらの更新を依然として行いたいと思った場合は、次のクエリは、サブクエリを使用しない場合と同じことを行う必要があります。

DB.T1のSONUMは、現在0ではなく、関連するSERVICEORDERがDB.T2でないレコードごとに0に更新されます。

まず、select文で更新する列をプレビューすることをお勧めします。それらを実際に変更するための更新ステートメントが続きます。

SELECT DB.T1.SONUM 
    , DB.T2.SERVICEORDER 
FROM DB.T1 
    LEFT JOIN DB.T2 
     ON DB.T1.SONUM = DB.T2.SERVICEORDER 
WHERE DB.T2.SERVICEORDER IS NULL 
AND DB.T1.SONUM <> 0 

および更新...

UPDATE DB.T1 
SET SONUM = 0 
FROM DB.T1 
    LEFT JOIN DB.T2 
     ON DB.T1.SONUM = DB.T2.SERVICEORDER 
WHERE DB.T2.SERVICEORDER IS NULL 
AND DB.T1.SONUM <> 0 
+0

UPDATE db.BIF050 SET D_DEPOSITQUOTEDDATE = (のSelect CaseときD_DATERECEIVED Far

+0

同じエラー..私は他の誰かが書いたすべてのスクリプトで同じエラーが発生すると本当に混乱しています – Far

+0

はSQLのバージョンに関連していますか? – Far

関連する問題