2010-01-21 121 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] 

我不知道该表的真实姓名,因为你有你的架构两个文件表。