[Python] [SQL Server] sp_execute_external_script使用记录

前言

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

  • 原因

  • 解决

从数据类型 nvarchar(max) 转换为 int 时出错

  • 报错代码

    
    
  • 报错
    从数据类型 nvarchar(max) 转换为 int 时出错。

  • 原因

  • 解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值