我在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

09-26 22:05
查看更多