我正在尝试通过存储过程从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 :(得分: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