2016-10-03 23 views
1

這可能有一個簡單的答案,但我無法弄清楚,因爲我仍然在SQL Server中使用R進行操作。我有一段代碼從SQL Server表中讀入數據,在R中執行並返回一個數據幀。SQL Server中的R:將數據框輸出到表中

execute sp_execute_external_script 
    @language=N'R', 
    @script=N'inp_dat=InputDataSet 
    inp_dat$NewCol=max(inp_dat$col1,inp_dat$col2) 
    new_dat=inp_dat 
    OutputDataSet=new_dat' 
    @input_data_1=N'select * from IM_COMP_TEST_SQL2016.dbo.temp_table'; 

我想插入new_dat到一個SQL Server表(select * into new_table from new_dat)。我如何去做這件事?提前致謝。

回答

3

在本tutorial所示,您可以在先前創建的表使用INSERT INTO ... EXEC的列對準腳本的數據幀的回報:

INSERT INTO Table1 
execute sp_execute_external_script 
    @language=N'R', 
    @script=N'inp_dat <- InputDataSet 
       inp_dat$NewCol <- max(inp_dat$col1,inp_dat$col2) 
       new_dat <- inp_dat', 
    @input_data_1=N'SELECT * FROM IM_COMP_TEST_SQL2016.dbo.temp_table', 
    @output_data_1=N'newdat'; 

然而,使用表查詢可能需要OPENQUERY()OPENROWSET()使用此SO Post中描述的特設分佈式查詢返回存儲過程的輸出:

存儲過程

CREATE PROCEDURE dbo.R_DataFrame 

AS 

BEGIN 
    execute sp_execute_external_script 
     @language=N'R', 
     @script=N'inp_dat <- InputDataSet 
        inp_dat$NewCol <- max(inp_dat$col1,inp_dat$col2) 
        new_dat <- inp_dat', 
     @input_data_1=N'SELECT * FROM IM_COMP_TEST_SQL2016.dbo.temp_table', 
     @output_data_1=N'newdat'; 

     -- ADD ALL COLUMN TYPES; 
     WITH RESULT SETS (("newdat" [col1] varchar(20), [col2] double, [col3] int ...)); 
END 
GO 

操作查詢

SELECT * INTO Table1 
FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 
       'EXEC dbo.R_DataFrame') 
+0

謝謝。這有幫助! – rookieJoe

+0

在嘗試第一種解決方案時,爲了直接插入到表中,我遇到以下錯誤:過程期望類型爲'ntext/nchar/nvarchar'的參數'@params'。你會知道是什麼造成了這種情況?被插入的表具有正確的列數,我沒有傳遞任何參數。謝謝。 – rookieJoe

相關問題