2013-08-22 87 views
0

我創建了一個肢解我的文件夾和行變換列變換行SQL

例如(由「\」分隔)查詢的SQL Server: 我的文件夾是"N:\TESTEA\subTESTEB"原本。在我的新表中,此值爲:每行 文件夾名稱。

N: 

TESTEA 

subTESTEB 

但是,我需要轉換它的列中的行。第1列第1行;第2列中的第2行;等等。

誰知道這方面的解決方案? 一個問題:這個文件夾有多層次,而不是一個標準的水平!

我很清楚嗎?

下面是我的SQL查詢(我不知道這裏格式化這個SQL代碼!):

DECLARE @ARRAY VARCHAR(8000), @DELIMITADOR VARCHAR(100), @S VARCHAR(8000),@ARRAYFinal VARCHAR(8000) 
select sub_folder_path into #sub_folder_path from GROUP_FOLDER_ACCESS 
SELECT @DELIMITADOR = '\' 
CREATE TABLE ARRAY(ITEM_ARRAY VARCHAR(8000)) 

WHILE (select COUNT(*) from #sub_folder_path) > 0 
BEGIN 
SELECT @ARRAY = sub_folder_path from #sub_folder_path ORDER BY sub_folder_path 
SET @ARRAYFinal = @ARRAY 
SET @ARRAY = @ARRAY + @DELIMITADOR 
WHILE LEN(@ARRAY) > 0 
BEGIN 
    SELECT @S = LTRIM(SUBSTRING(@ARRAY, 1, CHARINDEX(@DELIMITADOR, @ARRAY) - 1)) 
    INSERT INTO ARRAY (ITEM_ARRAY) VALUES (@S) 
    SELECT @ARRAY = SUBSTRING(@ARRAY, CHARINDEX(@DELIMITADOR, @ARRAY) + 1, LEN(@ARRAY)) 
END 
DELETE #sub_folder_path WHERE sub_folder_path = @ARRAYFinal 
END 

回答

1

如果您使用的是SQL 2005或以上,你可以使用PIVOT keyword,但它在某種程度上複雜,看看this的解決方案了。我只是嘗試過它,它的工作原理,但我不得不承認,我不完全瞭解一切。

假設你有一個名爲「路徑」與列「路徑」在您的路徑字符串表:

; with cte1 as (

    select 
    t2.Path, 
    t3.split, 
    ROW_NUMBER() over (partition by t2.Path order by t2.Path) as num 
    from 
    (
    select *, 
    CAST('<X>'+replace(t.Path,'\','</X><X>')+'</X>' as XML) as xmlfilter 
    from Paths t 
    ) t2 
    cross apply 
    (
    select col1data.D.value('.','varchar(50)') as split 
    from t2.xmlfilter.nodes('X') as col1data(D)) t3 
    ) 


    select Path, [1], [2], [3], [4], [5], [6], [7] 
from 
(
    select Path, num, split 
    from CTE1 
) as sourcetable 
pivot 
(max(split) for num IN ([1], [2], [3], [4], [5], [6], [7])) as pivottable 

我承認,這不是一個完全動態的版本。如果您正在尋找這樣的解決方案,您可能需要製作一些UDF進行拆分,然後使用遊標和while循環將數據填充到以前準備好的表格中。