[Python] [SQL Server] sp_execute_external_script使用记录
文章目录
- 前言
- 基本语法
- Error记录
- 1. 过程需要类型为 'nvarchar(128)' 的参数
- 2. Unsupported input data type
- 3. 过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@params'。
- 4. Invalid BXL stream
- 从数据类型 nvarchar(max) 转换为 int 时出错
- 解决
前言
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'。 - 原因
多个输入? - 解决
- 用with as将多个输入转成单个输入,仅限多个输入之间有关联的情况
- 别的解决方案(但我没看懂) 方案1 方案2
4. Invalid BXL stream
-
报错代码
-
报错
Invalid BXL stream
error while running BxlServer: caught exception: no message recieved from pipe -
原因
-
解决
- ref
从数据类型 nvarchar(max) 转换为 int 时出错
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
