2009-06-29 81 views
6

對不起,我試圖提供大量的信息來避免不相關的解決方案。來自select語句的SQL更新

我的目標是至少將1條UPDATE語句嵌入到SELECT語句中,以便我有機會在選擇語句運行之前更新一些計算值(將它想象爲SELECT上的TRIGGER)。 VIEW並不是即時解決方案,因爲我受到我使用的系統的限制(見下文)。

我正在定製功能較弱的第三方商業ERP(系統將保持無名! - 結果是你還沒有聽說過它,但它的家鄉也沒有)。它擁有一個可以使用文本/ GUI來構建SELECT查詢的預設查詢工具。保存查詢後,用戶可以單擊查詢來執行查詢並查看結果。 ERP運行在MS SQL Server 2000上;版本升級現在不在卡中。我可以使用任何我想要的語言編寫我需要的ERP外部功能集,如果功能允許,我可以在過去做過這些功能。但是,我的用戶社區發現,當我的定製可以在ERP系統中完成時更容易。

該查詢可以是任意複雜的,但ERP包本身構建SQL Select語句。內部編譯後的ERP是這樣的(這只是一個猜測!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond 

的GUI構建器可以幫助新手用戶建立字段列表等等,但你可以繞過它,寫文字,只要條款因爲如上所述組合時SQL是有效的。

我似乎無法找到一個咒語來運行存儲過程作爲SELECT語句的副作用,無論是在select子句,where子句等等。我真的不在乎我如何越獄系統 - 一個穩定的SQL注入攻擊會很好,只要它不意味着我必須修改底層sql server本身的安全性。我已經看過UDF,但是你不能把UPDATE語句放到標量UDF中,並且試圖修改表UDF的返回值(或者是否是這樣)是沒有意義的。如果你可以在VIEW中更新,那麼我希望看到一個例子,但我意識到我可以使用VIEW來計算列,這不是我正在尋找的解決方案。我在網上閱讀了一個關於能夠使用某種XP_來完成這個任務的暗示性聲明,但是至於XP_或者怎麼做,我不知道。

這個問題不解決,就其本身:Updating a table within a select statement

+0

僅供參考額外的研究表明,CLR函數可能讓我那裏,但CLR函數不可用在SQL 2000. – user130582 2009-06-29 19:04:58

回答

1

我想不出有什麼辦法可以將SELECT與UPDATE中的SQL 2000結合起來(雖然在2005年以後,OUTPUT子句可用)。然而,它看起來像你有三個字符串值(fieldList,tableListAndJoins,whereCond)與「SELECT」,「FROM」和「WHERE」連接在一起,並假設他們不做一些嚴重的SQL註釋類代碼檢測,你也許能夠雜牌一起這樣的事情:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn" 

tableListAndJoins = "MyTable" 

whereCond = "SomeColumn = 'Criteria'" 

[分號實際上是可選的,甚至可能沒有在SQL 2000的工作 - 他們只是說清楚其中一個命令結束和下一個開始。]

這樣做的缺點是您會收回兩個數據集。第一個將是一個空的一列集合(如果您想爲列指定一個名稱,則爲NULL),並且您想要的數據將位於第二個集合中。其他解決方法也許是可能的,這取決於如何使用這三個值以及如何捕獲錯誤。 (讓第一個查詢生成和錯誤,並希望更新和第二個查詢通過?)

+0

謝謝你讀完我寫的內容 – user130582 2009-07-01 20:48:01

0

stated on the last reply here

鏈接,這樣,原作者可以得到他/她應得的學分嘗試使用動態SQL存儲過程,希望對你有所幫助。

既然你想在UPDATE之前選擇SELECT,那麼你可以修改動態sql,就像我發佈的鏈接一樣,先做SELECT。

0

我不知道我理解你的處境的限制,但可以不只是你同時運行兩個語句,如:

string sql = "update MyTable set x=y;select x from MyTable;"; 
0

會存儲功能是一個選擇?你可以更加無縫地調用這些(至少在MySQL中),而不是「調用PROCEDURE_NAME(x)」,你可以使用「SELECT FUNCTION_NAME(x)」。

0

我對XP的猜測是你會編寫你自己的XP來做更新並以某種方式將它包含在查詢中。無論這種方式是否可行,查詢中的位置應該如何運行,以便在SQL查看數據之前運行,這完全不在我看來。

這聽起來像你已經嘗試了我想嘗試的一切。我感覺對你來說,因爲你運行select之後更新狀態可能相當容易。