(解)在SQLServer 中,在函數中使用 side-effect 運算?

今天發現了「在函數中使用副作用運算子 ‘rand’ 無效」的問題,於是下午到晚上都在讀 SQL 的東西。

我想最重要的,應該是微軟自己對於 SQL 函數的說明: User-Defined Function https://msdn.microsoft.com/en-us/library/ms191007.aspx 。有一段文字提到, “The statements in a BEGIN…END block cannot have any side effects. Function side effects are any permanent changes to the state of a resource that has a scope outside the function such as a modification to a database table. The only changes that can be made by the statements in the function are changes to objects local to the function, such as local cursors or variables. Modifications to database tables, operations on cursors that are not local to the function, sending e-mail, attempting a catalog modification, and generating a result set that is returned to the user are examples of actions that cannot be performed in a function." ,大意是說, BEGIN-END 區塊不可以有 side effects 的成份,像是動到區塊之外的全域變數、寄 e-mail 、或者丟出一堆查詢結果給客戶端等等的事情,都不應該發生。

看了如此描述,我覺得, SQLServer Function 很有 pure functional programming language 的味道。函數不能有副作用,是指讓任何一個函數同樣執行第二次,應該要得到與它執行第一次一樣的結果;而資料處理,特別須要「函數沒有 side effects 」這種特點,計算上才可以穩定。

但是,整體來說,未解的部份,假如 SQLServer Function 真的被當做純函數語言看待,那麼在 side effects 之有無的方面,我想知道 SQLServer Function 有沒有類似 Haskell 的 monads 那種包容及轉換的辦法。

另外,我還讀了更多。

像 stackoverflow.com 有些人會問,別的程式語言要怎麼跟 SQL 媒合,我想, rand() 是有 side effects 的東西,若有任何一個函數包含了 rand() ,那個函數就會有 side effects 。

“Learn SQL The Hard Way" http://sql.learncodethehardway.org/ ,開頭的說明蠻好的,他強調,只要你願意學,以學 SQL 來說,其實可以用 SQLite 這種很簡單又完整的平台即可學到這個語言的撰寫,而不是忙著接受別人的灌輸。他還提到了, SQL 本身假設資料庫是表格,而若要用其他程式語言處理資料,則大都是將資料假設為 graph ,所以,別的語言要與 SQL 媒合,就會有資料結構從 graph 對表格的兌換,或者從表格對 graph 的兌換等辦法;我覺得這一點很精闢,但是,在後來的教學內容中,沒有提到相關的內涵。而且,這本書可惜還沒寫完,在 0 到 14 節的文章都是極少的操作步驟,但是在第 15 節卻把很多關聯式資料庫的傳統內容一股腦兒地傾倒出來,而沒有結論。

“SQLite C Interface" https://www.sqlite.org/c3ref/prepare.html ,能處理 SQL 語句的編譯。我覺得我有個小專案會用到它。

“Relational Data Stream Management System" http://en.wikipedia.org/wiki/Relational_data_stream_management_system ,仿擬自 RDBMS 的縮寫,是現代所需要的平行處理系統格式。

“SQL Abstract Syntax Trees Vocabulary" http://ns.inria.fr/ast/sql/index.html ,談到 SQL 語法該怎麼表達成 RDF 。這部份有一點點超過我想知道的範圍。

廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Problem 並標籤為 。將永久鏈結加入書籤。