2016-09-07 13 views
0

を見つけるためにSQLを使用するには?は、どのように私はこのようになります巨大なテーブル内のいくつかのデータを持っている親のDirectoryID

DirID  ParentDirId Length   Directory 
3606   7788   70246   Y:\Foo\Bar 

ソース表:

CREATE TABLE [Datamap].[SourceFiles](
    [DirectoryID] int IDENTITY(1,1), 
    [Length] [float] NULL, 
    [Directory] [nvarchar](255) NULL, 
    [Extension] [nvarchar](255) NULL, 
    [Type] [nvarchar](max) NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

を私はすべての行にdirecotryのIDを持っています。

私はこれと私の解決策を編集しました。私は上記のように1つのテーブルを作成しました。このようなデータが含まれています:

directoryId Length Directory Extension Type 
23572 2270 Y:\Data\FS02-V\HarvardPilgrim\Development\Dory\FHCP ICD10 sql Sql Scripts 
23572 4396 Y:\Data\FS02-V\HarvardPilgrim\Development\Dory\FHCP ICD10 sql Sql Scripts 
23572 1420 Y:\Data\FS02-V\HarvardPilgrim\Development\Dory\FHCP ICD10 sql Sql Scripts 
+0

を必要に応じて、あなたが探しやテーブル名どのようなものされているIDを知っていますか? – Stivan

+0

http://social.technet.microsoft.com/wiki/contents/articles/17948.t-sql-right-left-substring-and-charindex-functions.aspx – Missy

+0

私のテーブルは@Stivanのように見えますが、私はディレクトリIDしか持っていません。私は今親のIDを提供したい。私はそれをディレクトリフィールドから取り除くことができると確信していますが、私はそれをどのようにしてその行に戻すのだろうと思います。 – VinnyGuitara

答えて

1

ここに1つの解決策があります。

Declare @YourTable table (directoryId int,Length int, Directory varchar(250)) 
Insert into @YourTable values 
(7788,631,'Y:\Foo'), 
(3606,70246,'Y:\Foo\Bar'), 
(3607,70246,'Y:\Foo\Bar\SomeDir & Date') 



;with cteBase as (
Select A.* 
     ,B.* 
From @YourTable A 
Cross Apply (Select Top 1 * from [dbo].[udf-Str-Parse](Replace(A.Directory,'&','&'),'\') Order By Key_PS Desc) B 
) 
Select A.directoryId 
     ,ParentDirId =B.directoryId 
     ,A.Length 
     ,A.Directory 
    From cteBase A 
    Left Join cteBase B 
    on (B.Directory+'\'+Replace(A.Key_Value,'&','&') = Replace(A.Directory,'&','&')) 

戻り

directoryId ParentDirId Length Directory 
7788  NULL  631  Y:\Foo 
3606  7788  70246 Y:\Foo\Bar 
3607  3606  70246 Y:\Foo\Bar\SomeDir & Date 

ザ・パーサUDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max)) 
As 
Begin 
    Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
    Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String) 
    Return 
End 
+0

メッセージレベル9421、レベル16、状態1、行1 XML解析:行1、文字96、不正な名前の文字 – VinnyGuitara

+0

ディレクトリ名のいずれかにアンパサンドが含まれていると思われます。興味深いのは、@VinnyGuitara。 – VinnyGuitara

+1

&とのダミーレコードを作成しましたが、同じエラーが発生しました。私に瞬間を与えてください –

関連する問題