Sql-Server

sp_execute_external_script 的錯誤

  • January 20, 2017

我想我遇到了sp_execute_external_script的錯誤,所以這裡是重播。

如果我執行以下腳本,我會收到錯誤消息:

-- error occurs
exec sp_execute_external_script @language=N'R'
, @script = N' result <- as.data.frame(c(i, j));'
, @params = N'@i varchar(100), @j varchar(100)'
, @i = 'hello'
, @j = 'world'
, @output_data_1_name = N'result' -- the position of this param caused problem
with result sets ((test varchar(100)));

我會得到一個錯誤

消息 8144,級別 16,狀態 2,第 1 行

過程或函式指定的參數過多。

但是,如果我只是向上移動,@output_data_1_name如下所示:

-- NO error occurs
exec sp_execute_external_script @language=N'R'
, @script = N' result <- as.data.frame(c(i, j));'
, @output_data_1_name = N'result' -- this position in front of @parms caused NO problem
, @params = N'@i varchar(100), @j varchar(100)'
, @i = 'hello'
, @j = 'world'
with result sets ((test varchar(100)));

我會得到一個正常的輸出:

在此處輸入圖像描述

有誰知道我做錯了什麼,或者它確實可能是 SQL Server 2016 中的一個錯誤?

我的環境是(按select @@version):

Microsoft SQL Server 2016 (SP1-CU1) (KB3208177) - 13.0.4411.0 (X64) 
   Jan  6 2017 14:24:37 
   Copyright (c) Microsoft Corporation
   Developer Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 14393: )

更新:我測試了一點,確實參數的位置會導致錯誤,例如:

exec sp_execute_external_script 
@script = N' result <- as.data.frame(c(i, j));'
, @output_data_1_name = N'result' -- the position of this param caused NO problem
, @params = N'@i varchar(100), @j varchar(100)'
, @i = N'hello'
, @j = N'world'
, @language=N'R' -- if I put @language here, it will cause error
with result sets ((test varchar(100)));

或這個:

exec sp_execute_external_script  @language=N'R'
, @script = N' result <- as.data.frame(c(i, j));'
, @output_data_1_name = N'result' -- the position of this param caused NO problem
, @i = N'hello'
, @j = N'world'
, @params = N'@i varchar(100), @j varchar(100)'
with result sets ((test varchar(100)));

錯誤消息將是:

消息 214,級別 16,狀態 175,過程 sp_execute_external_script,第 1 行

$$ Batch Start Line 19 $$

過程需要類型為“ntext/nchar/nvarchar”的參數“@params”。

但我實際上已經給出了每個類型的參數nvarchar

如果我沒有看到有人指出我的“錯誤”,我會考慮向 MS 送出錯誤報告。

中的參數列表可以具有與過程本身@params使用的參數名稱匹配的名稱,例如或。因此,需要有一種方法來確定參數是屬於系統 SP 還是屬於使用者腳本。sp_execute_external_script``@script``@language

使其@params成為始終在與使用者腳本有關的參數列表中最後指定的規則以及在考慮與使用者腳本有關的sp_execute_external_script所有參數之後指定的規則是實現區分的一種簡單方法。@params因此,如果在@language之後指定了 like 參數@params,它將被解釋為腳本參數,而不是 SP 的參數。

我相信這就是您指定@output_data_1_name@language之後發生的情況@params。這些參數必須放在前面@params以避免潛在的歧義。

誠然,手冊中沒有關於此的字眼,但是,這與手冊有關,而不是與sp_execute_external_script.

我收到了以下來自 MS Connect 的回复,我特意突出顯示了關鍵資訊(粗體)。所以簡而言之,這確實是一種設計行為。:-)

來自 Microsoft Connect 的問候!

此通知是為回饋項生成的:當命名參數不在特定位置時,sp_execute_external_script 將報告錯誤。您在 Microsoft Connect 站點上送出的內容。

此行為是設計使然。@language、@script 等強制參數必須在使用者定義參數之前先指定。這就像當今 T-SQL 中的 sp_executesql 行為。

如果 Microsoft 進行了任何其他更改,您也可能會收到一般的“已更新回饋項目”通知。

感謝您使用 Microsoft Connect!

問候,

Microsoft Connect 團隊

引用自:https://dba.stackexchange.com/questions/161564