文章目錄
前言
SQL Sever 2017及以後,開始支持在sql腳本里執行R和Python,官方的文檔雖然舉了很多例子,但實際使用起來還是踩了一些坑,記錄一下。
基本語法
sp_execute_external_script
@language = N'language',
@script = N'script'
[ , @input_data_1 = N'input_data_1' ]
[ , @input_data_1_name = N'input_data_1_name' ]
[ , @input_data_1_order_by_columns = N'input_data_1_order_by_columns' ]
[ , @input_data_1_partition_by_columns = N'input_data_1_partition_by_columns' ]
[ , @output_data_1_name = N'output_data_1_name' ]
[ , @parallel = 0 | 1 ]
[ , @params = N'@parameter_name data_type [ OUT | OUTPUT ] [ ,...n ]' ]
[ , @parameter1 = 'value1' [ OUT | OUTPUT ] [ ,...n ] ]
Error記錄
1. 過程需要類型爲 ‘nvarchar(128)’ 的參數
- 報錯代碼
EXEC sp_execute_external_script @language = N'Python' ,@script = N'print(test)' ,@input_data_1 = N'SELECT 1 AS hello' ,@input_data_1_name = 'test'
- 報錯
過程需要類型爲 'nvarchar(128)' 的參數 '@input_data_1_name'。
- 原因
@input_data_1_name的參數沒有轉成申明爲nvarchar - 解決
將第五行的@input_data_1_name = 'test'
改成@input_data_1_name = N'test'
2. Unsupported input data type
-
報錯代碼
EXEC sp_execute_external_script @language = N'Python' ,@script = N'print(test)' ,@input_data_1 = N'SELECT num FROM (SELECT 1.5/6 AS num) a' ,@input_data_1_name = N'test'
-
報錯
發生外部腳本錯誤:
Unsupported input data type in column 'num'.
Supported types: bit, tinyint, smallint, int, bigint, uniqueidentifier, real, float, char, varchar, nchar, nvarchar, varbinary, date, datetime, smalldatetime.
-
原因
input data的數據類型有問題 -
解決
把數據類型轉成Supported types的其中一個,如:
將第四行的num
改成CAST(num AS float)
3. 過程需要類型爲 ‘ntext/nchar/nvarchar’ 的參數 ‘@params’。
- 報錯代碼
EXEC sp_execute_external_script @language = N'Python' ,@script = N'print(test1, test2)' ,@input_data_1 = N'SELECT 1 AS num' ,@input_data_1_name = N'test1' ,@input_data_2 = N'SELECT 2 AS num' ,@input_data_2_name = N'test2'
- 報錯
過程需要類型爲 'ntext/nchar/nvarchar' 的參數 '@params'。
- 原因
多個輸入? - 解決
4. Invalid BXL stream
-
報錯代碼
-
報錯
Invalid BXL stream
error while running BxlServer: caught exception: no message recieved from pipe
-
原因
-
解決