T-SQL:根据动态列列表修改表

时间:2013-09-10 02:36:27

标签: asp.net sql-server-2008

我正在使用ASP.Net和SQL Server 2008.我有一个用户可以更新特定OR所有列的方案。因此,我的最佳解决方案是以这样的方式创建存储过程,以便我可以传递列名及其对应的值,并更新表。

我知道的一种方法是在前端创建整个SQL,动态地作为字符串并将其传递给存储过程。否则在存储过程中创建动态字符串。但是,这是最好的选择,还是可以有更优化的方式?

(我想在一次数据库旅行中这样做)

将会感谢任何可以指向正确方向的回应。

提前致谢...!

2 个答案:

答案 0 :(得分:0)

您可以像在ASP.NET中一样在存储过程中动态构建T-SQL语句,然后使用@sp_executesql执行动态构造的SQL字符串。

如果要执行此路由,则需要将列名和值列表提交到存储过程,然后在存储过程中构建SQL语句以使用@sp_executesql执行。

答案 1 :(得分:0)

如果您不需要将值设置为NULL,则可以使用NULL参数值来指示无更改

 create procedure dbo.UpdateStuff
   @BoxId as Int,
   @Length as Int,
   @Width as Int,
   @Height as Int
 as
   set nocount on
   update Boxes
     set Length = Coalesce( @Length, Length ),
       Width = Coalesce( @Width, Width ), Height = Coalesce( @Height, Height )
     where BoxId = @BoxId

如果值NULL很重要,那么您可以使用单独的标志来指示应替换值:

 create procedure dbo.UpdateStuff
   @BoxId as Int,
   @UpdateLength as Bit,
   @Length as Int,
   @UpdateWidth as Bit,
   @Width as Int,
   @UpdateHeight as Bit,
   @Height as Int
 as
   set nocount on
   update Boxes
     set Length = case when @UpdateLength = 1 then @Length else Length end,
       Width = case when @UpdateWidth = 1 then @Width else Width end,
       Height = case when @UpdateHeight = 1 then @Height else Height end
     where BoxId = @BoxId

这两种技巧并不相互排斥,因此您可以混合和匹配样式。