我有一个关于通过t-sql更新表的问题。客户端可能希望更新一行中的一列并保持其余列不变,或者他可能希望更新多列。所以我有两个解决方案:
创建一个sp并更新整个表。客户端必须提供所有参数,即使他想要更新一行中的单个列,所以如果他为他没有的参数传递(他必须)null ...那么原始值将会丢失。作为一种解决方法,我可以使用条件来检查空参数(基于条件的不同命令)。但是还有另一个问题,如何识别int参数?我的意思是假设我们有一个int列,可以有任何整数值,包括零,那么客户端应该发送什么来说“这不是一个新值,保持值不变”。
每列创建一个sp。客户端将使用适当的sp来更新一行中的单个列,因此如果他想要更新多个列,他可以一个接一个地调用每个相关的sp并传递两个参数,即行(s)id和新值。如果我有一个包含25个可更新列的表怎么办?天啊! 25只为一个表更新sp!
我是否必须为每个表列创建更新sp?或者创建一个sp,它接受所有行参数并更新整个表?编写更新程序的事实标准是什么?
EDIT1:我正在使用带有前端c#和asp.net app的sql server 2005,但我想在t-sql中使用它。
答案 0 :(得分:0)
如果您真的必须在T-SQL中执行此操作,那么对我来说唯一可行的方法是使用动态SQL。如果你考虑到这一点,你必须首先阅读(并理解!)Erland Sommarskogs优秀论文The curse and blessings of dynamic SQL - 绝对必读!
基本上,您只有一个存储过程可以获取25个参数。如果不需要更新,则每个都可以为NULL。
在存储过程中,您基本上根据哪些参数非NULL构建T-SQL UPDATE
语句,最后执行该语句。
这为您提供了一个程序,但是查看该程序会非常麻烦。
答案 1 :(得分:0)
您可以在更新中使用case语句并测试null
参数,以查看是否应该使用该参数,或者是否应该使用表中已有的值。
create procedure UpdateYourTable
@ID int,
@Col1 int = null,
@Col2 int = null
as
update YourTable
set Col1 = case when @Col1 is null
then Col1
else @Col1
end,
Col2 = case when @Col2 is null
then Col2
else @Col2
end
where ID = @ID
执行此类操作以设置Col2
的值,并为Col1使用默认值null
:
exec UpdateYourTable @ID = 1, @Col2 = 200