[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 时出错

  • 报错代码

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

  • 原因

  • 解决

你可能感兴趣的:(2020,学习笔记)