先來看一定會遇到的雷, 就是WHERE條件的單引號如下
一般來說WHERE條件遇到varchar是用單引號包起來, 但是由於外面已經有一組單引號, 所以語法會判斷錯誤, 解決方式就是用兩個單引號, 修改程式碼如下
另外在R裡, 物件類型有分 vector, matrix與list, 而如之前所說, R Service回傳資料到MSSQL時是吐出data frame的, 接下用vector當作範例, 來看一下, 一樣都是hello world但結果大不相同, 範例程式碼如下
眼尖的人, 是否看出差別了呢? Part1用了一個myvariable去接一個vector, 然後data frame把這個變數傳出來, 變成了一個欄位但是有三筆資料, 但是Part2 直接用data frame直接把這個vector傳出來, 所以是一筆資料但是有三個欄位, 我們還可以用str()來看一下傳出來的資料結構, 修改一下Part1程式碼如下
在Messages清楚看到一個變數三個物件, 再來修改一下Part2的程式碼如下
在Part2裡, Messages顯示的是一個物件三個變數, 由此可知在R裡, 程式碼只有些許不同, 但結果大相逕庭啊, 在操作上不可不甚!
接下來複習高中的矩陣運算, 將程式碼修改如下
由上圖可知, 從MSSQL傳進去2個row的資料會被視為2X1的矩陣, 指派給x, 而y被指派的一維陣列,視為1x4的矩陣, 所以高中數學有教 [ 2X1] * [1X4]=[2X4], 符合上述結果, 但是我們將x % * % y以y % * % x取代則會出現底下錯誤, 因[1X4] * [ 2X1], 不符合矩陣運算規則, 所以會報錯如下
但是若修改如下, 即MSSQL傳進去4個row的資料, 就變成 [1X4] * [4 * 1]=[1X1]
沒想到高中數學在此派上用場啦!
另外在MSSQL Table的欄位資料型態不盡然都能傳入R Service裡, Microsoft官方文件提到的限制如下
如果有遇到, 就用Cast做轉型處理, 以上就是一些會遇到的坑, 提供參考
本文參考
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql
https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/rtsql-r-and-sql-data-types-and-data-objects