将 R 脚本集成到 SELECT 查询中
Integrate R script into SELECT query
所以我有以下集成的 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
这很好用,它 returns 正是我想要的 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]
到目前为止,我还没有设法做到这一点。任何帮助将不胜感激。
考虑将整个 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 输入。
所以我有以下集成的 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
这很好用,它 returns 正是我想要的 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]
到目前为止,我还没有设法做到这一点。任何帮助将不胜感激。
考虑将整个 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 输入。