我将 ASP.Net 与 SQL Server 2008 一起使用。我有一个场景,用户可以更新特定的或所有列。因此,我的最佳解决方案是创建一个存储过程,以便我可以传递列名及其对应的值,并更新表。
我知道的一种方法是在前端动态创建整个 SQL 作为字符串并将其传递给存储过程。否则在存储过程中创建动态字符串。但是,这是最好的选择,还是有更优化的方法?
(我想在一次数据库之旅中做到这一点)
将不胜感激任何可以为我指明正确方向的回应。
提前致谢...!
我将 ASP.Net 与 SQL Server 2008 一起使用。我有一个场景,用户可以更新特定的或所有列。因此,我的最佳解决方案是创建一个存储过程,以便我可以传递列名及其对应的值,并更新表。
我知道的一种方法是在前端动态创建整个 SQL 作为字符串并将其传递给存储过程。否则在存储过程中创建动态字符串。但是,这是最好的选择,还是有更优化的方法?
(我想在一次数据库之旅中做到这一点)
将不胜感激任何可以为我指明正确方向的回应。
提前致谢...!
如果您不需要将值设置为 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
这两种技术并不相互排斥,因此您可以混合搭配风格。
您可以像在存储过程中那样在存储过程中动态构建您的 T-SQL 语句ASP.NET
,然后使用@sp_executesql
.
如果走这条路线,您需要将列名和值列表提交给存储过程,然后在存储过程中构建 SQL 语句以使用@sp_executesql
.