一个t-sql存储过程并更新整个表或

时间:2011-12-11 09:03:08

标签: sql-server-2005 tsql stored-procedures

我有一个关于通过t-sql更新表的问题。客户端可能希望更新一行中的一列并保持其余列不变,或者他可能希望更新多列。所以我有两个解决方案:

  1. 创建一个sp并更新整个表。客户端必须提供所有参数,即使他想要更新一行中的单个列,所以如果他为他没有的参数传递(他必须)null ...那么原始值将会丢失。作为一种解决方法,我可以使用条件来检查空参数(基于条件的不同命令)。但是还有另一个问题,如何识别int参数?我的意思是假设我们有一个int列,可以有任何整数值,包括零,那么客户端应该发送什么来说“这不是一个新值,保持值不变”。

  2. 每列创建一个sp。客户端将使用适当的sp来更新一行中的单个列,因此如果他想要更新多个列,他可以一个接一个地调用每个相关的sp并传递两个参数,即行(s)id和新值。如果我有一个包含25个可更新列的表怎么办?天啊! 25只为一个表更新sp!

  3. 我是否必须为每个表列创建更新sp?或者创建一个sp,它接受所有行参数并更新整个表?编写更新程序的事实标准是什么?

    EDIT1:我正在使用带有前端c#和asp.net app的sql server 2005,但我想在t-sql中使用它。

2 个答案:

答案 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