我创建了一个查询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
答案 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。
这是一个例子,请扔掉它。
也看看这个
Five methods converting rows to columns
这可能会帮助您完成任务。