Обработка строк при создании таблицы и вставке из другой таблицы - PullRequest
0 голосов
/ 22 января 2010

У меня есть таблица, которая содержит пути к файлам, например:

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

Я хочу разбить его на две таблицы, одну с уникальными каталогами и одну с именами файлов:

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

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

Так, например, если запись изначально была «C: /folder/file.jpg», я хочу, чтобы в каталогах была запись для «C: / folder /», и запись в «Файлах» будет обновлена, чтобы иметь «файл». jpg "для имени файла и идентификатора каталога новой записи в каталогах.

(Если вам интересно на этом этапе, причина, по которой мне нужно это сделать, заключается в том, что мне нужно отслеживать некоторую информацию на уровне каталога.)

Есть ли хороший способ сделать это в сценарии T SQL?

Ответы [ 2 ]

0 голосов
/ 22 января 2010
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 голосов
/ 22 января 2010

попробуйте это:

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]

Я не был уверен в реальных именах таблиц, потому что в вашей схеме есть две таблицы файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...