簡體   English   中英

T-SQL:基於動態列列表修改表

[英]T-SQL : Modify table based on dynamic column list

我在SQL Server 2008中使用ASP.Net。我有一種情況,用戶可以更新特定或所有列。 因此,我的最佳解決方案是以這種方式創建存儲過程,以便我可以傳遞列名及其對應的值,並更新表。

我知道的一種方法是在前端動態創建整個SQL字符串,並將其傳遞給存儲過程。 否則在存儲過程中創建動態字符串。 但是,這是最好的選擇,還是有一種更優化的方法?

(我想在一次數據庫旅行中做到這一點)

我們將不勝感激能為我指明正確方向的任何回應。

提前致謝...!

您可以像在ASP.NET一樣在存儲過程中動態構建T-SQL語句,然后使用@sp_executesql執行動態構建的SQL字符串。

如果采用這種方式,則需要將列名和值列表提交給存儲過程,然后在該存儲過程中構建要使用@sp_executesql執行的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

兩種技術不是互斥的,因此您可以混合使用樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM