2009-07-17 8 views
0

私は3つのテーブルを持っています。反復的なSQL更新クエリをどのようにリファクタリングするのですか?

1. Users 4 Cols 
UserID - User - RealName - Flags 

2. UsersGroups 2 Cols 
UserID - GroupID 

3. Groups 3 Cols 
GroupID - Group - Flags 

と私はUser = 'Administrator'ためUserテーブルの上にフラグを設定し、Groupのテーブルに同じを適用します。

私は以下のSQLが動作しますが、ビット演算子を使用して適用する必要があるいくつかのフラグもあります。

私のコードは実際には反復的であることがわかりました。誰かがリファクタリングを提案してパフォーマンスに影響を与えないか疑問に思っていました。

コード:

--- SET FLAG 1  
UPDATE User 
SET User.Flags = User.Flags | 2048 
WHERE User.Value = 'Administrator' 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = 'Administrator') | 2048 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = 'Administrator' 

-- SET FLAG 2  
UPDATE User 
SET User.Flags = User.Flags | 512 
WHERE User.Value = 'Administrator' 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = 'Administrator') | 512 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = 'Administrator' 

答えて

1

あなたが引数としてフラグビットの値とユーザ/グループ名を取り、ストアドプロシージャを作成し、クエリのパラメータとしてそれらを使用することができます - あなたが必要なときにストアドプロシージャを呼び出します旗に同様

何かを変更する(未テスト)

create proc usp_set_flags 
    @flag int 
    ,@username varchar(50) 
AS 
UPDATE User 
SET User.Flags = User.Flags | @flag 
WHERE User.Value = @username 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = @username) | @flag 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = @username 
GO 

(これは基本的な例を変える - いくつかの検証を追加することをお勧めだろうとあなたの目標は、単にグループを更新usersテーブルの上にUPDATEトリガーを作成し、groupsテーブル用UPDATE句を削除する場合

exec usp_set_flags @flag = 2048, @username = 'Administrator' 
0

:エラー)

をチェックあなたはそのようにようにそれを呼びたいです表。

関連する問題