我在SQL Server中运行r代码。我想将SQL Server数据库中的两个表作为输入数据集传递到R代码中。我可以使用@input_data_1
传递输入数据集之一。如何通过另一张桌子?
我从one MSDN help page读到说:
只能将一个输入数据集作为参数传递,您可以
仅返回一个数据集。但是,您可以从中调用其他数据集
在您的R代码中但是我还没有找到一种方法。
这是我与问题相关的代码:
EXEC sp_execute_external_script
@language = N'R'
,@script = N'
rules_set <- InputDataSet
#rules_set2 <- InputDataSet2 #need to be passed
'
,@input_data_1 = N'SELECT *
FROM [dbo].[[Rules_Set]'
有什么建议吗?
最佳答案
您可以使用serialization内置的R在SQL Server 2016中完成此操作。它确实很冗长,但是确实有效。
例如,设置两个单独的输入临时表(they cannot be table variables, unfortunately):
CREATE TABLE #Table1
(
[StrCol] NVARCHAR( 50 ),
[IntCol] INT
);
INSERT INTO
#Table1
(
[StrCol],
[IntCol]
)
VALUES
( N'testing data 1', 1 ),
( N'testing data 2', 2 )
;
CREATE TABLE #Table2
(
[StrCol] NVARCHAR( 50 ),
[IntCol] INT
);
INSERT INTO
#Table2
(
[StrCol],
[IntCol]
)
VALUES
( N'more testing data 1', 5 ),
( N'more testing data 2', 6 )
;
在这里,您可以创建VARBINARY类型,以保存用R转换的序列化结果。
DECLARE
@Table1_Input NVARCHAR( MAX ) = 'SELECT * FROM #Table1;',
@Table2_Input NVARCHAR( MAX ) = 'SELECT * FROM #Table2;',
@Table1_Data VARBINARY( MAX ),
@Table2_Data VARBINARY( MAX );
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
if( nrow(InputDataSet) == 0 )
stop("Invalid data passed in")
# Read in the sql table, serialize it to an output string
Output <- serialize(InputDataSet, NULL)
',
@input_data_1 = @Table1_Input,
@params = N'@Output VARBINARY( MAX ) OUTPUT',
@Output = @Table1_Data OUTPUT;
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
if( nrow(InputDataSet) == 0 )
stop("Invalid data passed in")
# Read in the sql table, serialize it to an output string
Output <- serialize(InputDataSet, NULL)
',
@input_data_1 = @Table2_Input,
@params = N'@Output VARBINARY( MAX ) OUTPUT',
@Output = @Table2_Data OUTPUT;
最后,
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
table1 <- unserialize(Table1_Data)
table2 <- unserialize(Table2_Data)
OutputDataSet <- rbind(table1, table2)
',
@params = N'@Table1_Data VARBINARY(MAX), @Table2_Data VARBINARY(MAX)',
@Table1_Data = @Table1_Data,
@Table2_Data = @Table2_Data
WITH RESULT SETS (( [Col1] NVARCHAR( 50 ), [Col2] INT ));
结果:
Col1 Col2
testing data 1
testing data 2
more testing data 5
more testing data 6