Удалить имя файла из пути - PullRequest
1 голос
/ 25 августа 2011

Я пишу план обслуживания, в котором базы данных будут отключены, после чего содержимое папки, в которой они находились, будет перемещено на другой диск для архивирования.

declare @db varchar(500), @path varchar(max), @SQL varchar(max)

declare u_cur cursor fast_forward for
    select name, [filename] from #DbsToBeDetached
open u_cur

fetch next from u_cur into @db, @path
while (@@FETCH_STATUS = 0)
begin
    SET @SQL = 'ALTER DATABASE ' + @db + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'

    EXEC(@SQL)      

    EXEC sp_detach_db @db, 'true';

    set @path = MagicFunction(@path)

    exec sp_xp_cmdshell 'move /Y "' + @path + '" "e:\archive\"' + @db + '"'

    fetch next from u_cur into @db, @path
end
close u_cur
deallocate u_cur

Единственное, на чем я застрял, это то, что я делаю, когда написано MagicFunction, чтобы повернуть путь как

D:\data\conversions\wi_sql2005\30950 example database\30950_data.mdf

до

D:\data\conversions\wi_sql2005\30950 example database

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

Вы можете создать функцию, используя следующую логику (или просто использовать встроенный SQL):

DECLARE @fileName VARCHAR(100)
SET     @fileName = 'D:\data\conversions\wi_sql2005\30950 example database\30950_data.mdf'
SELECT LEFT(@fileName, LEN(@fileName) - CHARINDEX('\', REVERSE(@fileName)))
2 голосов
/ 25 августа 2011

Хорошо, я думаю, что это в основном то, что вы хотите (но это может быть улучшено).

DECLARE @path NVARCHAR(200)

SET @path = 'D:\data\conversions\wi_sql2005\30950 example database\30950_data.mdf'

DECLARE @rec NVARCHAR(200)
SET @rec = REVERSE(@path)

DECLARE @Pos INT

SET @pos = CHARINDEX('\', @rec)
SET @rec = REVERSE(SUBSTRING(@rec, @pos + 1, LEN(@rec)))

PRINT @rec
1 голос
/ 25 августа 2011

Я добавил некоторые функции регулярного выражения CLR в экземпляр My sql. Я бы предположил, что тогда вы могли бы сказать что-то вроде ...

SET PATH = MagicFunctionsDB.schema.regexStrMatch(origfilename,'^.+(?=\\)',1 --indicates case sensitivity)
0 голосов
/ 25 августа 2011

Вероятно, есть более простой способ сделать это, о котором я не подозреваю, но вы можете разделить символ "\". В этом случае у вас будет массив из 6 переменных, что-то вроде paths (5). Затем перестройте строку, выполнив что-то вроде

For each Path in paths(5) - 1
   myPath = myPath + Path
Next

Вы в основном разбиваете свой путь на каждый каталог. Затем перестроить путь, но не указывать часть имени файла в конце. Надеюсь, это поможет.

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