簡體   English   中英

SQL Server存儲過程-根據變量名稱更新列。

[英]SQL Server stored procedures - update column based on variable name..?

我有一個包含許多存儲過程的數據驅動站點。 我最終想要做的是說一句話:

For Each @variable in sproc inputs
    UPDATE @TableName SET @variable.toString = @variable
Next

我希望它能夠接受任何數量的參數。

基本上,它將遍歷所有輸入,並使用變量的值更新具有變量名的列-例如,將使用@Name的值更新“名稱”列。 我基本上希望有一個用於更新的存儲過程和一個用於創建的存儲過程。 但是,要做到這一點,我將需要能夠將變量的實際名稱(而不是值)轉換為字符串。

問題1:是否可以在T-SQL中執行此操作?

問題2:使用類似的東西(例如性能或CPU使用率)是否有主要缺點?

我知道一個值是否無效,那么它將僅阻止涉及該變量和任何后續變量的更新,但是所有數據無論如何都已在vb.net代碼中進行了驗證,因此在提交到數據庫時始終有效,我將確保只能提交該列所在的變量。

提前謝謝了,

問候,

理查德·克拉克

編輯:

我知道使用SQL字符串和SQL注入攻擊的風險-幾周前我在論文中對此進行了一些研究。

基本上,網站使用面向對象的體系結構。 有許多類(例如Product),它們具有許多“屬性”(我創建了自己的名為Attribute的類,該類具有諸如DataField,Name和Value的屬性,其中DataField用於獲取或更新數據,Name顯示在管理中創建或更新產品時的前端,並且由管理員設置可能在客戶前端上顯示的值DataField是我將在“ UPDATE Blah SET @Field = @Value”中使用的字段。

我知道這可能令人困惑,但是它的解釋非常復雜-我腦海中對整個系統有很好的理解,但是我不能輕易地用語言表達出來。

基本上,結構是這樣設置的:沒有用戶可以更改DataField或Name的值,但他們可以更改Value。 我認為,如果我要使用動態參數化的SQL字符串,那么就不會有SQL注入攻擊的風險。

我的意思是基本上遍歷所有屬性,以便最終像這樣:

UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display

然后再次遍歷所有屬性並添加參數值-這與使用存儲過程具有相同的效果,對嗎?

我不介意增加頁面加載時間,因為這主要會影響管理前端,並且會稍微影響客戶前端。

問題1:您必須使用動態SQL-將update語句構造為字符串,然后使用EXEC命令運行它。

問題2:是的-SQL注入攻擊,格式錯誤的查詢風險,必須編譯單獨的SQL語句增加了開銷。

您的示例效率很低,因此如果我傳遞10列,您將更新同一張表10次嗎?

更好的方法是使用sp_executesql進行一次更新並動態生成此更新,看看“動態SQL的詛咒和祝福”以了解如何執行此更新

這是一個新系統,您可以根據需要自由設計嗎?還是堅持使用現有的數據庫設計?

您可能會考慮將屬性表示為子表中的行而不是列。

在父MyObject中,您僅具有標頭級數據,這些數據是系統中所有對象所共有的(可能只是一個標識符)。 在子表MyObjectAttribute中,您將具有的主鍵和另一列attrValue。 這樣,您可以像這樣執行UPDATE:

UPDATE MyObjectAttribute 
    SET attrValue = @myValue
    WHERE objectID = @myID
    AND attrName = @myAttrName

暫無
暫無

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

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