2010-01-21 122 views
0

我有一個包含文件路徑,像這樣的表:字符串處理

-------------------- 
|Files    | 
-------------------- 
|path nvarchar(500)| 
-------------------- 

我想把它分成兩個表,含有獨特的目錄,幷包含一個文件名之一:

--------------------------- 
|Files     | 
--------------------------- 
|filename nvarchar(255)| 
|directoryId int   | 
--------------------------- 

--------------------------- 
|Directories    | 
--------------------------- 
|id   int   | 
|path  nvarchar(255)| 
--------------------------- 

因此,例如,如果某個項目原來是「C:/folder/file.jpg」,我想在目錄中的條目「C:/文件夾/」,並在文件中的條目將被更新,以文件名和目錄中新條目的目錄ID有「file.jpg」。

(如果你想知道在這一點上,我需要這樣做的原因是因爲我需要跟蹤的目錄級別的一些信息。)

有沒有做到這一點的好辦法在T SQL腳本中?

+0

使用完整腳本等待某人時,可能需要查看T-SQL中的'CHARINDEX'函數,地址爲http://msdn.microsoft.com/it-it/library/ms186323.aspx – 2010-01-21 23:03:54

+0

還應該看看反向字符串函數。 http://msdn.microsoft.com/en-us/library/ms180040.aspx – 2010-01-21 23:05:12

+0

我曾見過這些函數,但希望有一些更高級的字符串處理隱藏在某處。可能不會!謝謝。 – eliah 2010-01-22 15:16:56

回答

0
DECLARE @FULL VARCHAR(50) 
DECLARE @PATH VARCHAR(50) 
DECLARE @FILE VARCHAR(50) 
DECLARE @directoryId INT 

DECLARE curs CURSOR FAST_FORWARD FOR 
SELECT path FROM FILES_1 

OPEN curs 
FETCH NEXT FROM curs 
INTO @FULL 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @FILE = right(@FULL, charindex('/',reverse(@FULL))-1) 
    SET @PATH = left(@FULL, len(@FULL) - charindex('/',reverse(@FULL))+1) 
    SET @directoryId = SELECT ID from Directories WHERE path = @PATH 

    BEGIN TRANSACTION 

     IF @directoryId IS NULL 
     BEGIN 
      INSERT INTO Directories VALUES (@PATH) 
      SET @directoryId = @@IDENTITY 
     END 

     INSERT INTO Files VALUES (@FILE,@directoryId) 

     IF @@ERROR <> 0 ROLLBACK 

    COMMIT TRANSACTION 
END 

CLOSE curs 
DEALLOCATE curs 

更改爲遊標!

+0

你在哪裏聲明@filename? – 2010-01-21 23:31:31

+0

複製和粘貼失敗,我咬你字符串操作,因爲它們比我的整潔!編輯 – 2010-01-21 23:35:35

+0

以獲取新的directoryid! – 2010-01-21 23:37:10

0

試試這個:

declare @filename varchar(500) 

set @filename = 'C:/Folder/file.jpg' 

select right(@filename, charindex('/',reverse(@filename))-1) 

select left(@filename, len(@filename) - charindex('/',reverse(@filename))+1) 

這將是整個轉換:

insert into Directories ([path]) 
select distinct 
    left([path], len([path]) - charindex('/',reverse([path]))+1) as [path] 
from files 

select 
    d.id, 
    right(f.[path], charindex('/',reverse(f.[path]))-1) 
from files f 
inner join directories d 
    on left(f.[path], len(f.[path]) - charindex('/',reverse(f.[path]))+1) = d.[path] 

我不知道該表的真實姓名,因爲你有你的架構兩個文件表。