2017-03-21 7 views
2

SQL Serverでrコードを実行しています。 SQL Serverデータベースには、Rコードに入力データセットとして渡したいテーブルが2つあります。 @input_data_1を使用して、入力データセットの1つを渡すことができます。他のテーブルをどうやって渡すことができますか?SQL Serverでrコードの入力パラメータとして2つのsqlテーブルを渡す方法

私はそれを言って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]' 

任意の提案?

+0

Windowsを使用していると仮定すると、RODBCを使用して入力を簡単に行うことができます。 –

+0

これはどういう意味ですか? (例、Windowsを使用しています)EXEC sp_execute_external_script @language = N'R ' 、@ script = N' library(RODBC) ch < - odbcConnect( "dsn"、uid = "sa"、pwd = "pass @input1 < - sqlFetch(ch、 "table1") input2 < - sqlFetch(ch、 "table2") ' –

+0

フォーマットがうんざりです。私はStackOverflowの新機能ですが、まだ質問をしてコメントを追加する方法を学んでいます –

答えて

5

serializationに組み込まれたRを使用すると、SQL Server 2016でこれを実行できます。ただし、これは間違いなく機能します。

例、セットアップ二つの別々の入力一時テーブル(they cannot be table variables, unfortunately):あなたは

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; 

最後にR.に翻訳されたシリアル化された結果を保持するためにVARBINARYタイプを作成することができますここから

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) 
    ; 

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 
+0

これらのテーブルをJSON形式で渡すことは可能ですか? – Eralper

+0

@Eralperどのテーブル? SPへのものかRへのものか? –

+0

私はRを意味します...私はSQL Server 2016と2017でテーブルデータをJSONに簡単に変換してから、これらの値をRに渡すことができると考えています。次に、Rライブラリを使用して表形式に戻す必要があります。私は正しい? – Eralper

関連する問題