文章目录
前言
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
-
原因
-
解决