2009-07-17 52 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触发表。