2016-10-07 5 views
0

例の選択を使用して返す行は、私が「/」に基づいて、異なる列の値でそれらを分割したい一方で、列は、このパスを含む列をselect文の '/'に基づいて個々の列に分割するにはどうすればよいですか?

/RS2015/DCA/Training/Summary 

が含まれています。

+0

列数は固定されていますか? –

+0

いいえ、パスに基づいて列を返す必要があります。パスが "/ RS2015/DCA/Training"の場合、return col1 = RS2015、col2 = DCa、col3 = Trainingです。 pathが長い場合は、パスのサイズに基づいて列を返します。 – Kelsey

+0

上限はありますか? –

答えて

0

私はテレビが役に立つかもしれません。現在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',' ') 
0

を必要に応じて

Select A.ID 
     B.* 
From YourTable A 
Cross Apply [dbo].[udf-Str-Parse-Row](Stuff(A.PathString,1,1,''),'/') B 

UDFを適用します。これは、クロスにも使用することができ

オプションとなりdynamic sqlxml

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 ║ 
╚═════════╩═════════╩══════════╩═════════╝ 
関連する問題