将R脚本集成到SELECT查询中

时间:2017-08-30 12:59:41

标签: sql-server r tsql sql-server-2016

所以我有以下集成的R代码,我用它来通过正则表达式来匹配东西而没有太多的复杂性(我想做的最终比这个例子更复杂,因此几乎需要正则表达式,这只是第一步):

DECLARE @in_adcn nvarchar(500)
DECLARE @out_ou nvarchar(500)
SET @in_adcn = N'CN=Surname\, Firstname (asdf),OU=999,OU=Department2,OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed'
SET @out_ou = N''

-- Extract department name from AD OU string
EXEC sp_execute_external_script @language=N'R',
    @script = N'
        pat = "^.+OU=([^,]+),OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed$";
        m <- gsub(pat, "\\1", regmatches(in_adcn1, gregexpr(pat, in_adcn1))[[1]]);
        out_ou1 <- m;',
    @params = N'@in_adcn1 varchar(500), @out_ou1 varchar(500) output',
    @in_adcn1 = @in_adcn,
    @out_ou1 = @out_ou OUTPUT
WITH RESULT SETS NONE;
SELECT @out_ou;
GO

这很好用,它会从AD distinguishedName字符串中返回我想要的内容(在本例中为“Department2”)。

现在我希望SELECT查询中的输出字符串(R脚本的输入字符串是acad.ADCn):

SELECT
    acad.ADCn,
    (
        --<here should be the code that returns the string from the R script above>
    ) AS Departmentname,
    acad.NBAccountName,
    acb.eMail
FROM
    MyDB.dbo.AccountTable AS acad
LEFT JOIN
    MyDB.dbo.AddressTable AS acb
    ON
        acad.[ObjectID]
        = acb.[ObjectID]

到目前为止,我还没有设法做到这一点。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

考虑将整个SELECT查询作为@input_data_1参数输入(在tutorial示例之后)。然后,将正则表达式操作运行到新保存的数据框列 DepartmentName 。最后,输出整个四列结果集。

EXECUTE sp_execute_external_script
      @language = N'R'
    , @script = N' df <- InputDataSet;
                   pat = "^.+OU=([^,]+),OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed$";
                   df$DepartmentName <- gsub(pat, "\\1", regmatches(df$ADCn, gregexpr(pat, df$ADCn))[[1]]);
                   OutputDataSet <- df[c("ADCn", "DepartmentName", "NBAccountName", "eMail")];'
    , @input_data_1 = N' SELECT acad.ADCn, acad.NBAccountName, acb.eMail
                         FROM MyDB.dbo.AccountTable AS acad
                         LEFT JOIN MyDB.dbo.AddressTable AS acb
                            ON acad.[ObjectID] = acb.[ObjectID];'
    WITH RESULT SETS (( [ADCn] varchar(255), [DepartmentName] varchar(255), [NBAccountName] varchar(255), [eMail] varchar(255) ));

当然没有数据,上面是未经测试的。请调整以适应需要,特别是输入ADCn。