[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 時出錯。

  • 原因

  • 解決

發佈了9 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章