2017-03-08 71 views
0

我试图通过存储过程从SQL Server运行基本R脚本。我正在返回一个数据集,也想返回/输出一个变量,但我无法做到这一点。如何从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的值。 任何帮助表示赞赏。

在此先感谢!

+0

我这里看不到任何R代码里面。 –

+0

R代码只有2行。 iris_data < - iris, out = 5.1; –

回答

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 
+0

感谢您的帮助,但由于我是在SQL Server中使用R的新手,我有点困惑。我不确定如何运行代码的第一部分(即以library(sqlrutils)开始并以registerStoredProcedure(sp)结尾)。 我是否在SSMS中运行这段代码,而没有将它包裹在任何东西中?请帮忙。 –

+0

该代码是R代码。你在R会话中运行它。 –

+0

我是否创建任何连接字符串,以便R知道写入/保存此存储的Proc的位置? –