2011-08-25 129 views
1

我正在编写一个维护计划,在该维护计划中数据库将被分离,然后将其驻留的文件夹的内容移至另一个驱动器进行归档。从路径中删除文件名

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 

回答

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))) 
+0

逻辑倒退,因为我需要的路径不是文件,但我认为这将工作。 –

+0

我认为你正在做相反的事情。 OP希望PATH减去文件名。 –

+0

我在99%的地方编辑了你的答案,但你给了/ 5分钟后我会接受的错误的一面。 –

1

我已经将一些CLR正则表达式函数添加到My sql实例中。我建议,那么你可以这样说...

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

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

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

重建您的字符串您基本上正在分解到每个目录的路径。然后重建路径,但在文件名部分结束。希望有所帮助。

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 
+0

将它降低到一个SET语句(虽然很长),并且你会有我如何实现这个。 –