【发布时间】:2019-06-12 17:37:23
【问题描述】:
应用程序开发人员要求我创建三个不同的存储过程来更新同一个表。每个存储过程更新不同的列,并在其应用程序的不同点调用。我知道必须有一种方法可以创建一个可以完成工作的组合存储过程。
起初,我尝试创建一个带有“switch”参数的存储过程,该参数会根据 switch 参数更新每个存储过程中的列。
CREATE PROCEDURE dbo.[Upd_table1]
(@switch INT, @ID INT,
@col1 INT, @col2 INT, @col3 INT, @col4 INT, @col5 INT,
@col6 INT, @col7 INT, @col8 INT, @col9 INT)
AS
BEGIN
IF (@switch = 1)
UPDATE dbo.table1
SET col1 = @col1, col4 = @col4, col5 = @col5, col6 = @col6
WHERE ID = @ID
ELSE IF (@switch = 2)
UPDATE dbo.table1
SET col2 = @col2, col9 = @col9
WHERE ID = @ID
ELSE IF (@switch = 3)
UPDATE dbo.table1
SET col3 = @col3, col7 = @col7, col8 = @col8
WHERE ID = @ID
END
这按预期工作,但我想知道是否有办法移除开关并使用提供的任何参数更新表。
【问题讨论】:
-
你有没有尝试使用
CASE表达式? -
有,但不如使用开关高效。您可以将更新写为
UPDATE dbo.table1 SET col1 = ISNULL(@col1, col1), col2=ISNULL(@col2, col2), ..., col9 = ISNULL(@col9, col9) WHERE ID = @ID。这会产生相当多的开销,并且不会处理有人不小心为不应针对此特定情况更新的参数传递非 NULL 值的情况。 -
@LaughingVergil 这是我的一个想法,但想知道是否有更好的方法;似乎没有?感谢您的帮助
标签: sql-server tsql sql-server-2012