1

重複の可能性:
SQL Server 2005 で 1 つのステートメントで 2 つのテーブルを更新する方法

2 つのテーブルがあり、一方のテーブルを更新して、もう一方のテーブルに反映する必要があります。

これらの 2 つのテーブルは関係によってリンクされています

t1.col1 PK , t2.col1 FK   

t1                t2
_____________  _____________
|col1|  col2|  |col1 |col2 |            
|----|------|  |-----|-----|                             
|1   |  a   |  | 1   | d   |            
|2   |  b   |  | 2   | e   |            
|3   |  c   |  | 3   | f   |            
|____|______|  |_____|_____|

SQL Server 2008 でこれら 2 つのテーブルを 1 つのクエリで更新するにはどうすればよいですか?

私はそのようなことをしたい

 Update College 
 Inner Join Class ON College.CollegeId = Class.CollegeId 
 set College.CollegeId = '33333333-3333-3333-3333-333333333333',
     Class.CollegeId = '33333333-3333-3333-3333-333333333333' 
 where 
     College.CollegeId = '071887ea-3c93-40ce-a112-3b849d352064' 

しかし、私はエラーが発生します:

キーワード「Inner」付近の不適切な構文

4

3 に答える 3

2

1 つの接続で 1 つのクエリで 1 つのステートメントを使用して 2 つのテーブルを更新するか、1 つの接続で 1 つのクエリで 2 つのステートメントを使用して 2 つのテーブルを更新するかに関係なく、実際には同じことです。

スクリプトに渡すパラメーターを設定すると、値を 1 回送信し、スクリプトを 1 回実行するだけで、1 つの接続のみを使用できます。

declare @OldCollegeID
declare @NewCollegeID

Update Class set CollegeID = @NewCollegeID
where CollegeID = @OldCollegeID

Update College set CollegeID = @NewCollegeID
where CollegeID = @OldCollegeID

しかし、これを同時にやりたい理由は、関係のためにクラスを更新せずに最初に大学を更新できないからだと思いますか? College.CollegeID を更新しようとすると、外部キー Class.CollegeID が原因でエラーが発生します。同じことがビザの逆にも当てはまります。更新先の Class.CollegeID が College.CollegeID に存在しない限り、Class.CollegeID は更新できません。この場合、私は次のことを提案します。

Create Procedure UpdateCollegeID
(
   declare @OldCollegeID varchar(100),
   declare @NewCollegeID varchar(100)
)

as

declare @CollegeName varchar(100)
declare @ClassName varchar(100)

set @CollegeName = (select CollegeName from College where CollegeID = @OldCollegeID)
set @ClassName = (select ClassName from Class where CollegeID = @OldCollegeID)

Insert into College (CollegeID, CollegeName)
Values(@NewCollegeID, @NewCollegeName)

Insert into Class (ClassID, CollegeID)
Values(@ClassID, @NewCollegeID, @ClassName)

Delete from Class where CollegeID = @OldCollegeID
Delete from College where CollegeID = @OldCollegeID

これにより、すべての古い大学の記録が新しい ID で更新されるので、心配する必要はありません。それが何であるかに応じて、これに対応するために、フロントエンドアプリケーションで別のことをしなければならない場合があります。ストアド プロシージャのままにしておくと、それを実行できるようになり、すべてが渡されたパラメータに更新されます。

于 2012-06-04T09:55:05.200 に答える
2

このように達成
できます: トランザクションを使用して、2 つの UPDATE ステートメントが正しく処理されるようにします。

BEGIN TRANSACTION

UPDATE Table1
  SET Table1.col1= 'XXXX' 
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '010008'

UPDATE Table2
SET Table2.col1 = 'XXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '010008'

専念

于 2012-06-04T08:28:48.610 に答える
-2

以下のようなことができます

 UPDATE T1 INNER JOIN T2 ON T1.COL1 = T2.COL1 SET T1.COL2 = 'X', T2.COL2= 'Y'
 WHERE T1.COL1 = 2

ハッピーコーディング!!!

于 2012-06-04T08:22:58.487 に答える