我正在编写一个维护计划,其中数据库将被分离,然后它所在的文件夹的内容将被移动到另一个驱动器进行存档。
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
答案 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
您基本上是在分析每个目录的路径。然后重建路径,但最后留下文件名部分。希望有所帮助。