使用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代码中手动构造输出,所以我总是得到一个?
答案 0 :(得分:4)
根据Microsoft文档,目前无法返回多个表。它陈述了page:
只能将一个输入数据集作为参数传递,您可以 只返回一个数据集。
但是,您可以返回其他单个变量,如here所述:
通常,来自存储过程的R的输出 sp_execute_external_script仅限于单个数据帧。 (这个 将来可能会删除限制。)
但是,您可以返回其他类型的输出,例如标量 除了数据框外。
还有一个如何做的例子。
答案 1 :(得分:0)
可以以块矩阵的形式返回多个表(module-name
或data.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
的功能类似。