2017-08-30 44 views
1

所以我有以下的,我用它來能夠通過正則表達式匹配的東西沒有太多的併發症(我想最終做的是比這個例子更復雜,所以正則表達式是非常綜合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過程/函數來爲你做這件事嗎? –

回答

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時,請根據需要進行調整。

+0

幾乎完美!只剩下2個問題:不知何故,這將爲每個ADCn返回相同的部門名稱(應該有很多不同的部分)。第一個包含「Department9」的ADCn似乎是一次又一次被使用的ADCn,因爲最終它們都在「Department9」(這不是真的)。第二個問題:這會在消息輸出中生成一個「文本表」。這不應該返回一個「真正的」表,因爲這是我需要的。謝謝! – cheh

+0

是不是由於這行代碼中的'[1]':'df $ DepartmentName < - gsub(pat,「\\ 1」,regmatches(df $ ADCn,gregexpr(pat,df $ ADCn)) [[1]]);'? 「真正的桌子」是什麼意思?當我運行類似的代碼時,我得到一個結果集,列回等。 –

+0

是的,謝謝。並沒有關於桌子問題,我只是有一個不同的顯示活動。它現在按預期工作。謝謝大家。 – cheh