SQL Server R多个结果集

时间:2017-07-30 15:43:08

标签: sql-server r datatable dataset analytics

使用SQL Server 2016+执行R脚本是否有可能获得多个表?让我们从互联网上随机抽取一个简单的例子(不需要发布我的文章就不会过分复杂化):

EXEC sp_execute_external_script
  @language =N'R',
  @script=N'OutputDataSet<-InputDataSet',
  @input_data_1 =N'SELECT 1 AS hello'
  WITH RESULT SETS (([hello] int not null));

发布于here

此处结果作为单个表返回。让我们说我用数据进行各种计算,现在我想返回多个表。

例如:

a<-InputDataSet

b<-InputDataSet + 5

这些将返回两个不同的表作为结果。现在我无法想出任何好的方法来返回两个单独的表中的数据,因为它只返回一个表。显然,我可以这样回复:

OutputDataSet<-data.frame(a, b)

但是处理不同的功能和不同的数据很快就会变得非常麻烦。例如,我使用函数lm。现在,一个数据集将被计算估计值,另一个数据集将是参与该等式的每个列的系数。同样,当然我可以加入这两个数据表并稍后处理它们,但输出结果在很多情况下变得很大。

该过程的参数如下:..., @output_data_1_name,但没有@output_data_2_name等,因此我没有看到方法。也许有可能创建OutputDataSet所以它拥有多个表?如果是这样的话 - 由于我缺乏经验,我在R中并不知道这种方式。

tldr; 是否可以返回多个结果集,或者我唯一的解决方案是在R代码中手动构造输出,所以我总是得到一个?

2 个答案:

答案 0 :(得分:4)

根据Microsoft文档,目前无法返回多个表。它陈述了page

  

只能将一个输入数据集作为参数传递,您可以   只返回一个数据集。

但是,您可以返回其他单个变量,如here所述:

  

通常,来自存储过程的R的输出   sp_execute_external_script仅限于单个数据帧。 (这个   将来可能会删除限制。)

     

但是,您可以返回其他类型的输出,例如标量   除了数据框外。

还有一个如何做的例子。

答案 1 :(得分:0)

可以以块矩阵的形式返回多个表(module-namedata.frame)。 data.table将从data.table::rbindlist(L, fill = T)L的{​​{1}}列表中创建一个块矩阵

data.frame

这确实需要data.table软件包,出于其他原因,我建议使用该软件包。

还有DROP TABLE IF EXISTS temp153462 CREATE TABLE temp153462 ([speed] int NULL, [dist] int NULL, [sepal_length] float NULL, [sepal_width] float NULL, [petal_length] float NULL, [petal_width] float NULL, [species] nvarchar(20) NULL) insert into temp153462 exec sp_execute_external_script @language = N'R', @script = N'library(data.table) library(datasets) print(cars) print(iris) OutputDataSet <- rbindlist(list(cars, iris), fill = T) print(OutputDataSet)' SELECT speed, dist FROM temp153462 WHERE speed is not NULL SELECT sepal_length, sepal_width, petal_length, petal_width FROM temp153462 WHERE sepal_width is not NULL 的功能类似。