2009-07-17 55 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表標誌爲User = 'Administrator'和應用相同的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 

(這是一個改變基本的例子 - 這將是一個好主意,添加一些驗證和錯誤檢查)

你會然後調用它像這樣:

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

如果你的目標是消除UPDATE子句groups表,後來乾脆就users表更新組創建UPDATE觸發表。