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

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

问题描述:

我有一个关于通过t-sql更新表的问题。客户可能想要更新一列中的一列,并保持其余的不变或他可能想要更新多列。所以我有两种解决方案:一个t-sql存储过程和更新整个表或

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

  2. 为每列创建一个sp。客户端将使用适当的sp来更新一行中的单个列,所以如果他想更新多个列,他可以一个接一个地调用每个相关的sp,并传递两个参数,它们是行ID和新值。如果我有一个包含25个可更新列的表?天啊! 25更新sp只是一张桌子!

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

EDIT1:我正在使用sql server 2005与前端c#和asp.net应用程序,但我想在t-sql中做到这一点。

+1

您正在使用什么版本的SQL Server? – Oded

如果你真的必须在T-SQL中做到这一点,那么唯一可行的方法是使用动态SQL。如果你考虑到这点,你必须首先阅读(并理解!)厄兰Sommarskogs优秀论文The curse and blessings of dynamic SQL - 绝对必读!

基本上,你会有一个存储过程,需要你的25个参数。如果不需要更新,其中的每一个都可以为NULL。

在你的存储过程中,你基本上根据哪些参数是非NULL来建立你的T-SQL UPDATE语句,最后执行那条语句。

这给你一个程序,但该程序将是相当凌乱的看看。

您可以在更新中使用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