Как вернуть переменную при запуске R из SQL Server

Я пытаюсь запустить базовый сценарий R из SQL Server через хранимую процедуру. Я возвращаю набор данных, а также хочу вернуть/вывести переменную, но не могу этого сделать.

Ниже приведена хранимая процедура, которую я имею

DROP PROC IF EXISTS get_iris_dataset;  
go  
CREATE PROC get_iris_dataset  
AS  
BEGIN  
declare @OutName float
 EXEC   sp_execute_external_script  
   @language = N'R'  
 , @script = N'
    iris_data <- iris
    out = 5.1;'  
 , @input_data_1 = N''  
 , @output_data_1_name = N'iris_data'  
 ,@params= N'@out float OUTPUT'
 ,@out = @OutName OUTPUT

 WITH RESULT SETS (("Sepal.Length" float not null,   
       "Sepal.Width" float not null,  
    "Petal.Length" float not null,   
    "Petal.Width" float not null, "Species" varchar(100)));  
END;  
return 0 
go  

Я вызываю процедуру, как показано ниже:

declare @OutputVar float
exec @OutputVar = get_iris_dataset
print @OutputVar

Он выводит набор данных, но я не могу сохранить значение OutputVar.

Я не могу вернуть значение OutputVar, даже если я не вывожу набор данных, а только пытаюсь зафиксировать значение OutputVar. Любая помощь приветствуется.

Заранее спасибо!


person nasia jaffri    schedule 08.03.2017    source источник
comment
Я не вижу здесь R-кода.   -  person Tim Biegeleisen    schedule 08.03.2017
comment
Всего 2 строки R-кода. iris_data ‹- радужка, аут = 5,1;   -  person nasia jaffri    schedule 08.03.2017


Ответы (1)


Я бы использовал функцию StoredProcedure (часть пакета sqlrutils, который, в свою очередь, является частью MS R Server 9.0.1), чтобы обернуть код R в хранимую процедуру. Это немного отличается от исходного кода, поскольку возвращаемые значения заключены в список. Но идея все та же.

library(sqlrutils)

testfunc <- function()
{
    iris_dataset <- iris
    out <- 5.1
    list(iris_dataset=iris_dataset, out=out)
}

sp <- StoredProcedure(testfunc, "spTestFunc",
    OutputData("iris_dataset"),
    OutputParameter("out", "numeric"),
    connectionString="<your_connection_string>")

registerStoredProcedure(sp)

Сделав это, вы можете щелкнуть правой кнопкой мыши процесс в SSMS, выбрать «выполнить хранимую процедуру», и SSMS сгенерирует для вас некоторый код. Код будет выглядеть так:

USE [databasename]
GO

DECLARE @return_value int,
        @out_outer float

EXEC    @return_value = [dbo].[spTestFunc]
        @out_outer = @out_outer OUTPUT

SELECT  @out_outer as N'@out_outer'

SELECT  'Return Value' = @return_value

GO

И если вам нужен только выходной номер, вы можете упростить код до этого:

DECLARE @out_outer float

EXEC    [dbo].[spTestFunc]
        @out_outer = @out_outer OUTPUT

SELECT  'Return Value' = @out_outer
GO
person Hong Ooi    schedule 08.03.2017
comment
Спасибо за вашу помощь, но поскольку я новичок в использовании R в SQL Server, я немного запутался. Я не уверен, как запустить первую часть кода (т.е. начиная с библиотеки (sqlrutils) и заканчивая registerStoredProcedure (sp)). Нужно ли запускать этот фрагмент кода в SSMS, не оборачивая его ни во что? Пожалуйста помоги. - person nasia jaffri; 08.03.2017
comment
Создаю ли я какую-либо строку подключения, чтобы R знал, где записать/сохранить этот сохраненный Proc? - person nasia jaffri; 08.03.2017
comment
Укажите строку подключения ODBC, которую вы будете использовать для входа в базу данных. - person Hong Ooi; 08.03.2017