从路径中删除文件名

时间:2011-08-25 19:18:30

标签: sql sql-server-2005 tsql

我正在编写一个维护计划,其中数据库将被分离,然后它所在的文件夹的内容将被移动到另一个驱动器进行存档。

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 个答案:

答案 0 :(得分:3)

您可以使用以下逻辑创建函数(或仅使用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)))

答案 1 :(得分:2)

好的,我认为这基本上就是你想要的(但可以改进)。

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

答案 2 :(得分:1)

我在My sql实例中添加了一些CLR正则表达式函数。我会建议,然后你可以说类似......

SET PATH = MagicFunctionsDB.schema.regexStrMatch(origfilename,'^.+(?=\\)',1 --indicates case sensitivity)

答案 3 :(得分:0)

有一种更简单的方法可以做到这一点,我不知道但你可以拆分“\”字符。在这种情况下,您将拥有一个包含6个变量的数组,如paths(5)。然后,通过执行类似

的操作重建字符串
For each Path in paths(5) - 1
   myPath = myPath + Path
Next

您基本上是在分析每个目录的路径。然后重建路径,但最后留下文件名部分。希望有所帮助。