集成[R脚本到SELECT查询

集成[R脚本到SELECT查询

问题描述:

所以我有以下的,我用它来能够通过正则表达式匹配的东西没有太多的并发症(我想最终做的是比这个例子更复杂,所以正则表达式是非常综合R代码里面需要的,这仅仅是第一步):集成[R脚本到SELECT查询

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] 

到目前为止,我还没有成功地得到这个权利呢。任何帮助将不胜感激。

+0

你想要的是有一个标量用户定义函数,调用你在'acad.ADcn'中传入函数的'sp_execute_external_script'。但是,由于你不能从函数内调用UDF,所以你运气不好。但是,在这种情况下 - 为什么你要使用R for regex,难道你不能创建一个SQLCLR过程/函数来为你做这件事吗? –

考虑将整个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时,请根据需要进行调整。

+0

几乎完美!只剩下2个问题:不知何故,这将为每个ADCn返回相同的部门名称(应该有很多不同的部分)。第一个包含“Department9”的ADCn似乎是一次又一次被使用的ADCn,因为最终它们都在“Department9”(这不是真的)。第二个问题:这会在消息输出中生成一个“文本表”。这不应该返回一个“真正的”表,因为这是我需要的。谢谢! – cheh

+0

是不是由于这行代码中的'[1]':'df $ DepartmentName

+0

是的,谢谢。并没有关于桌子问题,我只是有一个不同的显示活动。它现在按预期工作。谢谢大家。 – cheh