例の選択を使用して返す行は、私が「/」に基づいて、異なる列の値でそれらを分割したい一方で、列は、このパスを含む列をselect文の '/'に基づいて個々の列に分割するにはどうすればよいですか?
/RS2015/DCA/Training/Summary
が含まれています。
例の選択を使用して返す行は、私が「/」に基づいて、異なる列の値でそれらを分割したい一方で、列は、このパスを含む列をselect文の '/'に基づいて個々の列に分割するにはどうすればよいですか?
/RS2015/DCA/Training/Summary
が含まれています。
私はテレビが役に立つかもしれません。現在9つのポジションを返していますが、展開するのは簡単です。
Declare @String varchar(max) = '/RS2015/DCA/Training/Summary'
Select * from [dbo].[udf-Str-Parse-Row](Stuff(@String,1,1,''),'/')
戻り
Pos1 Pos2 Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9
RS2015 DCA Training Summary NULL NULL NULL NULL NULL
注:私は最初に/を除去するためにSTUFF()を使用。これは、ここで
CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
,Pos6 = xDim.value('/x[6]','varchar(max)')
,Pos7 = xDim.value('/x[7]','varchar(max)')
,Pos8 = xDim.value('/x[8]','varchar(max)')
,Pos9 = xDim.value('/x[9]','varchar(max)')
From (Select Cast('<x>' + Replace(@String,@Delimiter,'</x><x>')+'</x>' as XML) as xDim) A
)
--Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ')
を必要に応じて
Select A.ID
B.*
From YourTable A
Cross Apply [dbo].[udf-Str-Parse-Row](Stuff(A.PathString,1,1,''),'/') B
UDFを適用します。これは、クロスにも使用することができ
オプションとなりdynamic sql
とxml
DECLARE @str VARCHAR(8000) = '/RS2015/DCA/Training/Summary',
@start INT= 1,
@count INT,
@sql VARCHAR(max) = ''
SET @count = Len(@str) - Len(Replace(@str, '/', ''))
SET @sql = ';WITH Split_Names AS
(
SELECT CONVERT(XML,''<Names><name>'' + REPLACE(''' + Stuff(@str, 1, 1, '') + ''',''/'', ''</name><name>'') + ''</name></Names>'') AS xmlname
)
SELECT
'
WHILE @start <= @count
BEGIN
SET @sql +=Concat('xmlname.value(''/Names[1]/name[', @start, ']'',''varchar(500)'') as [column',@start,'], ')
SET @start+=1
END
SET @sql =LEFT(@sql, Len(@sql) - 1)
SET @sql+= ' FROM Split_Names'
--select @sql
EXEC(@sql)
を使用して一つの方法であります結果:
╔═════════╦═════════╦══════════╦═════════╗
║ column1 ║ column2 ║ column3 ║ column4 ║
╠═════════╬═════════╬══════════╬═════════╣
║ RS2015 ║ DCA ║ Training ║ Summary ║
╚═════════╩═════════╩══════════╩═════════╝
列数は固定されていますか? –
いいえ、パスに基づいて列を返す必要があります。パスが "/ RS2015/DCA/Training"の場合、return col1 = RS2015、col2 = DCa、col3 = Trainingです。 pathが長い場合は、パスのサイズに基づいて列を返します。 – Kelsey
上限はありますか? –