2017-05-14 51 views
2

我正試圖清理SQL Server中的一些Active Directory數據。我已經設法將原始LFD文件讀入表中。現在我需要清理一些屬性,其中值分佈在多行上。我可以通過具有領先空間的事實來識別需要追加到先前記錄的記錄。T-SQL:清理數據,將行合併到列中

實施例:

ID  Record      IsPartOfPrior 
3114  memberOf:      0 
3115  CN=Sharepoint-Members-home  1 
3116  memberOf:      0 
3117  This is       1 
3118  part of the      1 
3119  next line.      1 

最終,我想有如下表生成:

ID   Record 
3114  memberOf:CN=Sharepoint-Members-home 
3116  memberOf:This is part of the next line 

我可以通過遊標寫,設置變量,與臨時表的工作和填充表。但是,必須有一套基於(也許是遞歸?)的方法呢?

我可以使用STUFF方法將各行組合在一起,但我該如何將各種組合在一起?我在想,我首先必須定義每個記錄的groupID,然後將它們按組ID綁定在一起?

感謝您的任何幫助。

+0

提示:使用'STUFF' – Sami

+1

如果你正在讀大概在代碼AD數據,那麼你爲什麼不保存到數據庫之前,串聯值是多少? – Phil

回答

0

以下評論批註。應該從開始工作SQL Server 2008

--Here I emulate your table 
DECLARE @yourtable TABLE (ID int, Record nvarchar(max), IsPartOfPrior bit) 

INSERT INTO @yourtable VALUES     
(3114,'memberOf:',0),(3115,'CN=Sharepoint-Members-home',1),(3116,'memberOf:',0),(3117,'This is',1),(3118,'part of the',1),(3119,'next line.',1) 

--Getting max ID 
DECLARE @max_id int 

SELECT @max_id = MAX(ID)+1 
FROM @yourtable 

--We get next prior for each prior record 
--And use STUFF and FOR XML PATH to build new Record 
SELECT y.ID, 
     y.Record + b.Record as Record 
FROM @yourtable y 
OUTER APPLY (
     SELECT TOP 1 ID as NextPrior 
     FROM @yourtable 
     WHERE IsPartOfPrior = 0 and y.ID < ID 
     ORDER BY ID ASC 
    ) as t 
OUTER APPLY (
    SELECT STUFF((
     SELECT ' '+Record 
     FROM @yourtable 
     WHERE ID > y.ID and ID < ISNULL(t.NextPrior,@max_id) 
     ORDER BY id ASC 
     FOR XML PATH('') 
      ),1,1,'') as Record 
) as b 
WHERE y.IsPartOfPrior = 0 

輸出:

ID   Record 
----------- ----------------------------------------- 
3114  memberOf:CN=Sharepoint-Members-home 
3116  memberOf:This is part of the next line. 

如果ID是數字和上升這將工作。

0

另一個選擇如果2012+

Declare @YourTable Table ([ID] int,[Record] varchar(50),[IsPartOfPrior] int) 
Insert Into @YourTable Values 
(3114,'memberOf:',0) 
,(3115,'CN=Sharepoint-Members-home',1) 
,(3116,'memberOf:',0) 
,(3117,'This is',1) 
,(3118,'part of the',1) 
,(3119,'next line.',1) 

;with cte as (
    Select *,Grp = sum(IIF([IsPartOfPrior]=0,1,0)) over (Order By ID) 
    From @YourTable 
) 
Select ID 
     ,Record = Stuff((Select ' ' +Record From cte Where Grp=A.Grp Order by ID For XML Path ('')),1,1,'') 
From (Select Grp,ID=min(ID)from cte Group By Grp ) A 

返回

ID  Record 
3114 memberOf: CN=Sharepoint-Members-home 
3116 memberOf: This is part of the next line. 

如果與可視化幫助的CTE產地:

ID  Record      IsPartOfPrior Grp << Notice Grp Values 
3114 memberOf:     0    1 
3115 CN=Sharepoint-Members-home 1    1 
3116 memberOf:     0    2 
3117 This is      1    2 
3118 part of the     1    2 
3119 next line.     1    2 
+0

請注意,'IIF'與SQL Server 2012及更高版本一起使用。 – gofr1

+0

另外。 SUM()OVER()是2012年以後的.... –

+0

@ gofr1非常真實,我應該有資格。 (做了符號) –