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.frame
或 data.table
)。 data.table::rbindlist(L, fill = T)
将从L
的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
这确实需要 data.table
包,我出于其他原因推荐它。
还有plyr::rbind.fill()
做类似的事情。
【讨论】:
以上是关于SQL Server R 多个结果集的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server - 从子-父-子中选择并返回多个结果集