Stored Procedure 幾乎是有在用資料庫的必備技能點, 而Stored Procedure有一個常用的功能就是參數化然後取得結果, 其實就是類似寫程式Function的概念, 所以先來寫個簡單的, 宣告a, b兩個整數變數, 傳進R裡做相加, 從R回傳相加結果, 在SSMS輸入底下程式碼並執行
這邊有兩個眉角要注意的是@params, 它負責對應MSSQL定義的變數與 R裡面變數, 另一個是OutputDataSet委派的類型必須是data frame.
那接下來做複雜一點加工, 改用R的rnorm函數來隨機產生數值, rnorm的說明如下:
rnorm(n, mean = 0, sd = 1)
n 為產生隨機值個數(長度), mean 是平均數, sd 是標準差
將程式碼修改如下
看來沒甚麼問題, 再來小修一下並執行, 建立一個mytest的Stored Procedure如下
接者到tempdb下, 檢查mytest是否正確被建立?
然後執行mytest, 看是否成功?
接下來的重頭戲是如何處理R Plot的圖形呢? 這邊我們拿前一篇安裝好的ggplot2來實作一下, 修改程式碼如下
這邊要注意一下就是在R裡面繪製的圖形, 傳出來給MSSQL時, 必須是binary, 然後用 varbinary(max)去接, 然後SSMS的Results就是顯示binary的資料, 那我們如何視覺化binary的資料呢? 有一個最快的方式就是安裝SSMSBoost, 它是SSMS的一個add-in, 有提供Community (Free) 與 Professional的版本, 一開始下載後可以免費試用30天, 之後有可以申請 Community Key或是購買Professional的版本, 參考如下
http://www.ssmsboost.com/VersionCompare
所以接下來到SSMSBoost官網下載試用版
執行安裝程式, 下一步直接安裝到底, 然後重啟SSMS
再把剛剛的程式碼執行一遍, 在varbinary的欄位上, 按下右鍵內容, 選擇Picture( any format)如下
接著就會在小畫家看到這張圖囉!
打完收工
本文參考
https://www.r-bloggers.com/using-parameter-and-multiparameters-with-sp_execute_external_script/
https://reformatcode.com/code/r/r-plot-rendering-sql-server-2016-using-spexecuteexternalscript