0

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

2 回答 2

1

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

假设您有一个名为“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 循环将数据填充到先前准备好的表中。

于 2013-08-23T12:17:02.147 回答
0

我有一个选择。您还可以将枢轴用于动态。

这是示例,请扔掉它。

动态枢轴

也看看这个

将行转换为列的五种方法

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

于 2013-08-23T03:49:24.820 回答