выполнить R с помощью sp_execute_external_script throws Процедура ожидает параметр '@params' типа 'ntext / nchar / nvarchar' - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь запустить это простое доказательство концепции:

DECLARE @p1 INT;
DECLARE @p2 INT;

    SET @p1 = 1;
    SET @p2 = 2;

    execute sp_execute_external_script
        @language=N'R',
        @script=N'inp_dat <- InputDataSet
                  inp_dat$sum <- inp_dat$p1 + inp_dat$p2
                  new_dat <- inp_dat',
        @input_data_1 = N'SELECT @p1 AS p1, @p2 AS p2',
        @output_data_1 = N'newdat';

Здесь 2 параметра передаются в виде таблицы в R, которая затем создает вычисляемый столбец и возвращает фрейм данных R в виде таблицы.В настоящее время я получаю:

Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'.

Есть идеи?

PS:

Это работает в том смысле, что я получаю сумму обратно:

DECLARE @p1 int;
DECLARE @p2 int;

SET @p1 = 2;
SET @p2 = 3;

DECLARE @inquery NVARCHAR(MAX)
SET @inquery = N'SELECT ' + CAST(@p1 AS NVARCHAR(MAX)) + N' AS p1, ' + CAST(@p2 AS NVARCHAR(MAX)) + N' AS p2;'

DECLARE @sum FLOAT; 

EXEC sp_execute_external_script
  @language =N'R',
  @script=N'
            sum <- InputDataSet[1,1] + InputDataSet[1,2]
          ',
  @input_data_1 = @inquery, 
  @params = N'@sum FLOAT OUTPUT',
  @sum = @sum OUTPUT 
  ;

  SELECT @sum AS SUM
GO

PPS:

Получение - единственная проблема - имена столбцов данных не возвращаются:

DECLARE @p1 int;
DECLARE @p2 int;

SET @p1 = 2;
SET @p2 = 3;

DECLARE @inquery NVARCHAR(MAX)
SET @inquery = N'SELECT ' + CAST(@p1 AS NVARCHAR(MAX)) + N' AS p1, ' + CAST(@p2 AS NVARCHAR(MAX)) + N' AS p2;'

DECLARE @sum FLOAT; 

EXEC sp_execute_external_script
  @language =N'R',
  @script=N'
            sum <- InputDataSet[1,1] + InputDataSet[1,2]
            InputDataSet$sum <- InputDataSet$p1 + InputDataSet$p2
            OutputDataSet <- InputDataSet
          ',
  @input_data_1 = @inquery, 
  @params = N'@sum FLOAT OUTPUT',
  @sum = @sum OUTPUT 
  ;

  SELECT @sum AS SUM
GO

1 Ответ

0 голосов
/ 20 ноября 2018

Я только что натолкнулся на эту превосходную серию , которая привела меня к этому решению:

DECLARE @p1 int;
DECLARE @p2 int;

SET @p1 = 2;
SET @p2 = 3;

DECLARE @inquery NVARCHAR(MAX)
SET @inquery = N'SELECT ' + CAST(@p1 AS NVARCHAR(MAX)) + N' AS p1, ' + CAST(@p2 AS NVARCHAR(MAX)) + N' AS p2;'

DECLARE @sum FLOAT; 

EXEC sp_execute_external_script
  @language =N'R',
  @script=N'
            InputDataSet$sum <- InputDataSet$p1 + InputDataSet$p2
            OutputDataSet <- InputDataSet
          ',
  @input_data_1 = @inquery 
  WITH RESULT SETS(( p1 INT,p2 INT,[sum] INT))
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...