我正在使用ASP.Net和SQL Server 2008.我有一个用户可以更新特定OR所有列的方案。因此,我的最佳解决方案是以这样的方式创建存储过程,以便我可以传递列名及其对应的值,并更新表。
我知道的一种方法是在前端创建整个SQL,动态地作为字符串并将其传递给存储过程。否则在存储过程中创建动态字符串。但是,这是最好的选择,还是可以有更优化的方式?
(我想在一次数据库旅行中这样做)
将会感谢任何可以指向正确方向的回应。
提前致谢...!
答案 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
这两种技巧并不相互排斥,因此您可以混合和匹配样式。