【问题标题】:One t-sql stored procedure and updating a whole table or一个 t-sql 存储过程并更新整个表或
【发布时间】:2012-01-17 18:32:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

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


【解决方案1】:

如果您真的必须在 T-SQL 中执行此操作,那么对我来说唯一可行的方法是使用动态 SQL。如果您考虑到这一点,您必须首先阅读(并理解!)Erland Sommarskogs 的优秀文章The curse and blessings of dynamic SQL - 绝对必读!

基本上,您将拥有一个包含 25 个参数的存储过程。如果不需要更新,每个都可以为 NULL。

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

这为您提供了一个程序,但该程序看起来会很混乱。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2018-10-03
      • 2013-05-28
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多