1

我将 ASP.Net 与 SQL Server 2008 一起使用。我有一个场景,用户可以更新特定的或所有列。因此,我的最佳解决方案是创建一个存储过程,以便我可以传递列名及其对应的值,并更新表。

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

(我想在一次数据库之旅中做到这一点)

将不胜感激任何可以为我指明正确方向的回应。

提前致谢...!

4

2 回答 2

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

这两种技术并不相互排斥,因此您可以混合搭配风格。

于 2013-09-10T12:42:22.400 回答
0

您可以像在存储过程中那样在存储过程中动态构建您的 T-SQL 语句ASP.NET,然后使用@sp_executesql.

如果走这条路线,您需要将列名和值列表提交给存储过程,然后在存储过程中构建 SQL 语句以使用@sp_executesql.

于 2013-09-10T02:40:28.327 回答