SQL Server R 多个结果集

Posted

技术标签:

【中文标题】SQL Server R 多个结果集【英文标题】:SQL Server R multiple result sets 【发布时间】:2018-01-06 04:25:57 【问题描述】:

是否可以通过使用 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 代码中手动构造输出,这样我总是会得到一个?

【问题讨论】:

【参考方案1】:

根据 Microsoft 文档,目前无法返回多个表。它在这个page上声明:

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

但是,您可以返回额外的单个变量,如 here 所述:

一般来说,存储过程中 R 的输出 sp_execute_external_script 仅限于单个数据帧。 (这 将来可能会取消限制。)

但是,您可以返回其他类型的输出,例如标量,在 添加到数据框。

还有一个例子说明如何做到这一点。

【讨论】:

谢谢,我相信这已经足够了。非常感谢您为研究所做的努力。 也感谢我。我已经阅读了很多关于这个问题的文章 - 对于输入和输出数据集 - 并且完全错过了返回额外标量输出的技巧。为指出该链接而欢呼!【参考方案2】:

可以以块矩阵的形式返回多个表(data.framedata.table)。 data.table::rbindlist(L, fill = T) 将从Ldata.framedata.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

这确实需要 data.table 包,我出于其他原因推荐它。

还有plyr::rbind.fill() 做类似的事情。

【讨论】:

以上是关于SQL Server R 多个结果集的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 从子-父-子中选择并返回多个结果集

sql server存储过程如何输出结果集

基于 Distinct 结果集在 Microsoft SQL Server 中创建表

SQL Server检索存储过程的结果集

sqlserver自定义函数里面 怎么循环查询多条结果集

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?