如何重构重复的SQL更新查询?

如何重构重复的SQL更新查询?,sql,sql-server,tsql,refactoring,Sql,Sql Server,Tsql,Refactoring,我有三张桌子 1. Users 4 Cols UserID - User - RealName - Flags 2. UsersGroups 2 Cols UserID - GroupID 3. Groups 3 Cols GroupID - Group - Flags 我想为User='Administrator'设置User表上的标志,并将其应用于组表 我有下面的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
表上的标志,并将其应用于

我有下面的SQL可以工作,但我也有几个标志,我必须使用位运算符应用它们

我发现我的代码非常重复,所以我想知道是否有人可以建议一些不会影响性能的重构

代码:


您可以创建一个存储过程,将标志位值和用户/组名作为参数,并将它们用作查询的参数,然后在需要更改标志时调用该存储过程

类似于(未经测试)

(这是一个基本示例-最好添加一些验证和错误检查。)

你可以这样称呼它:

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

如果您的目标是删除
groups
表的
UPDATE
子句,则只需在
users
表上创建一个
UPDATE
触发器即可更新groups表

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'