【问题标题】:How to return a variable when Running R from SQL Server从 SQL Server 运行 R 时如何返回变量
【发布时间】:2017-03-08 05:15:44
【问题描述】:

我正在尝试通过存储过程从 SQL Server 运行基本的 R 脚本。我正在返回一个数据集,并且还想返回/输出一个变量,但我无法做到这一点。

下面是我的存储过程

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 的值。 任何帮助表示赞赏。

提前致谢!

【问题讨论】:

  • 我在这里没有看到任何 R 代码。
  • 只有 2 行 R 代码。 iris_data

标签: sql-server r microsoft-r


【解决方案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 中右键单击 proc,选择“执行存储过程”,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

【讨论】:

  • 感谢您的帮助,但是由于我是在 SQL Server 中使用 R 的新手,所以我有点困惑。我不确定如何运行代码的第一部分(即以 library(sqlrutils) 开头并以 registerStoredProcedure(sp) 结尾)。我是否在 SSMS 中运行这段代码,而不用任何东西包装它?请帮忙。
  • 我是否创建任何连接字符串,以便 R 知道在哪里写入/保存这个存储的 Proc?
  • 提供用于登录数据库的 ODBC 连接字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多