2017-10-26 5 views
2

頻繁に、テキストパッドの正規表現の組み合わせを使用してこれを実行しますが、SQLでプログラム的なアプローチがあれば理想的です自動化されたクエリの作業を開始する可能性があります。SQL Serverドキュメントを追加する単一区切り線へのパスの区切り

文書の区切りで画像パスのCSVファイルを指定した場合:

Doc,Path,DocBreak 
Doc01,C:\Image\01.tif,Y 
Doc02,C:\Image\02.tif, 
Doc03,C:\Image\03.tif, 
Doc04,C:\Image\04.tif,Y 
Doc05,C:\Image\05.tif, 
Doc06,C:\Image\06.tif,Y 

私はパターンとしてYを使用して出力のこの種を取得するためのアプローチを探しています、マルチに各パスを追加します-delimitedフィールド、および各Y docブレークのループ:

Doc,Path 
Doc01,C:\Image\01.tif|C:\Image\02.tif|C:\Image\03.tif 
Doc04,C:\Image\04.tif|C:\Image\05.tif 
Doc06,C:\Image\06.tif 

これには便利なSQL関数はありますか?

私はMicrosoft SQL Server MGMT studioを使用しています。ありがとう。

答えて

0

サーバーのバージョンがSQL 2012以上の場合。あなたは、これを使用

DECLARE @Temp TABLE (Doc VARCHAR(20), Path VARCHAR(20),DocBreak VARCHAR(20)) 
INSERT INTO @Temp VALUES 
('Doc01','C:\Image\01.tif','Y'), 
('Doc02','C:\Image\02.tif',NULL), 
('Doc03','C:\Image\03.tif',NULL), 
('Doc04','C:\Image\04.tif','Y'), 
('Doc05','C:\Image\05.tif',NULL), 
('Doc06','C:\Image\06.tif','Y') 

;WITH T AS (

SELECT *, GRP = SUM(CASE WHEN DocBreak ='Y' THEN 1 ELSE 0 END) OVER(ORDER BY Doc) 
FROM @Temp 
) 
SELECT T1.Doc, STUFF(X.Path,1,1,'') Path FROM T T1 
    OUTER APPLY (SELECT '|' + Path FROM T T2 WHERE T2.GRP = T1.GRP FOR XML PATH('')) X (Path) 
WHERE T1.DocBreak = 'Y' 

結果することができます

Doc     Path 
-------------------- -------------------------------------------------------- 
Doc01    C:\Image\01.tif|C:\Image\02.tif|C:\Image\03.tif 
Doc04    C:\Image\04.tif|C:\Image\05.tif 
Doc06    C:\Image\06.tif 
0

CSVファイルの文字列を解析している場合

Declare @csv varchar(max) = ' 
Doc,Path,DocBreak 
Doc01,C:\Image\01.tif,Y 
Doc02,C:\Image\02.tif, 
Doc03,C:\Image\03.tif, 
Doc04,C:\Image\04.tif,Y 
Doc05,C:\Image\05.tif, 
Doc06,C:\Image\06.tif,Y 
' 

;with cte as (
     Select A.RetSeq 
       ,B.* 
       ,Grp = sum(case when B.Pos3='Y' then 1 else 0 end) over (Order by A.RetSeq) 
     From (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(@csv,char(13)+char(10),'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
       ) A 
     Cross Apply (
         Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) 
           ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) 
           ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) 
         From (Select Cast('<x>' + replace((Select replace(A.RetVal,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
        ) B 
     Where Pos2 is not null and Pos3<>'DocBreak' 
) 
Select Top 1 with ties 
     Doc = Pos1 
     ,Path =Stuff((Select Distinct '|' +Pos2 From cte Where Grp=A.Grp For XML Path ('')),1,1,'') 
From cte A 
Order By Row_Number() over (Partition by Grp Order by RetSeq) 

戻り

Doc  Path 
Doc01 C:\Image\01.tif|C:\Image\02.tif|C:\Image\03.tif 
Doc04 C:\Image\04.tif|C:\Image\05.tif 
Doc06 C:\Image\06.tif 
関連する問題