2010-05-24 118 views
0

我有一個數據驅動的網站與許多存儲過程。我想最終能夠做的就是這樣說:SQL Server存儲過程 - 基於變量名稱更新列。

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

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

它基本上遍歷所有輸入,並用變量的值更新列的名稱 - 例如列「Name」將更新爲@Name的值。我想基本上有一個存儲過程進行更新,一個用於創建。不過要做到這一點,我需要能夠將變量的實際名稱而不是值轉換爲字符串。

問題1:在T-SQL中可以這樣做嗎?如果是這樣的話?

問題2:使用類似這樣的東西(比如性能或CPU使用率)有什麼主要缺點嗎?

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

很多感謝,

問候,

理查德·克拉克

編輯:

我知道如何使用SQL字符串和SQL注入攻擊的風險 - 我這個研究了一下在幾個星期前我的論文。

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

我知道這可能是令人困惑的,但它的解釋真的很複雜 - 我對頭腦中的整個系統有很好的理解,但我不能很容易地把它寫進文字。

基本上建立這樣的結構,使得沒有用戶將能夠更改DataField o的值r名稱,但它們可以更改值。我認爲如果我使用動態參數化的SQL字符串,那麼就不會有SQL注入攻擊的風險。

我的意思是通過所有的屬性基本上循環,使其結束了,如:

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

然後遍歷一次的所有屬性,並添加參數值 - 這將有同樣的效果,使用存儲過程,對??

我不介意增加頁面加載時間,因爲這主要影響到管理前端,並且會對客戶前端產生一定的影響。

+1

敢問我爲什麼要這樣做? – 2010-05-24 19:34:02

+0

我想這樣做是爲了能夠向管理前端的產品添加屬性。我基本上有一個名爲ProductManager的「管理器」類中的Product,例如Product。 ProductManager繼承自Manager,它循環遍歷Products表中的所有行,並在創建時爲每個行創建Product的實例,並提供正確的詳細信息。我想擴展這個,以便管理員能夠添加一個屬性,然後他們可以在客戶前端使用。不幸的是,這意味着每次更改sprocs .. – ClarkeyBoy 2010-05-25 11:04:12

回答

2

問題1:您必須使用動態SQL - 將您的更新語句構建爲字符串,並使用EXEC命令運行它。

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

+0

我添加了更多詳細信息,並將此答案考慮在內。 – ClarkeyBoy 2010-05-24 16:53:47

+0

不,您不能參數化您傳遞給'EXEC'的動態SQL。 – 2010-05-24 20:47:24

2

你的例子效率很低,所以如果我通過10列,你會更新同一個表10次?

更好的方法是使用sp_executesql的做一個更新,動態構建這個,看看The Curse and Blessings of Dynamic SQL看你怎麼也得去做

0

在這裏,您可以自由到新系統必要時進行設計,還是堅持使用現有的數據庫設計?

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

在父級MyObject中,您只需擁有標頭級別的數據,這些數據對於系統中的所有對象(可能只是一個標識符)都是通用的。在子表MyObjectAttribute中,您將擁有包含另一列attrValue的主鍵。這樣你可以這樣做更新:

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

我曾考慮過這一點 - 但當前的實時系統需要更新,這需要進行太多的更改才能實現,而沒有發生錯誤的巨大風險。我的意思是,目前所有的屬性都存儲爲列。系統目前有點慢 - 第一次加載大概需要2-3秒(此後幾乎是瞬間)。我覺得實施你的建議可能會減慢太多。你有沒有嘗試過這樣的方法?它工作嗎?它有效嗎? 謝謝。 Richard – ClarkeyBoy 2010-05-25 22:29:26

+0

想到別的什麼,參照你的第一句話 - 基本上管理員將能夠添加和刪除屬性,因爲他們希望。有一些標準屬性,如「創建」,「修改」和「ID」。也有一些只適用於某些類型的項目。我的目標是管理員應該能夠爲特定類型的項目添加字段。 我在我的個人資料中添加了有關該網站的更多信息(包括網站地址)。 – ClarkeyBoy 2010-05-25 23:27:14