转换SQL列中的行

时间:2013-08-22 15:13:47

标签: sql sql-server tsql

我创建了一个查询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

2 个答案:

答案 0 :(得分:1)

如果您使用的是SQL 2005或更高版本,则可以使用PIVOT keyword,但它有点复杂,请查看this解决方案。我只是尝试了它并且它有效,尽管我不得不承认我并不完全理解所有事情。

假设您有一个名为“Paths”的表,其中包含路径字符串所在的“Path”列:

; 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循环来填充先前准备好的表中的数据。

答案 1 :(得分:0)

我有一个选择。你也使用pivot for dynamic。

这是一个例子,请扔掉它。

Dyanamic Pivot

也看看这个

Five methods converting rows to columns

这可能会帮助您完成任务。