2011-08-25 195 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語句(雖然很長),並且你會有我如何實現這個。 –