用于从文件夹和子文件夹中获取分离数据库的脚本

时间:2012-11-08 14:34:07

标签: sql sql-server database

有没有办法找出SQL Server数据库是否从包含许多子文件夹的目录附加,除了转到每个.mdf的属性并检查它是否已附加?

是否有一个脚本可以检查文件夹/子文件夹是否写入文件来完成此操作?

感谢所有。

2 个答案:

答案 0 :(得分:1)

这应该很容易做到:

首先,我将查询数据库服务器sysdatabase表,找到你附加的所有数据库,并找到相应的文件名并存储在临时表中。

使用xp_cmdshell函数执行dos DIR命令,列出所有MDF / LDF文件,并使用正确的开关导航文件夹并将结果存储在另一个临时表中

比较这些表格,您将能够找到未附加的文件。

我以前做过类似的任务,并且使用了SSIS和Direct Transact-SQL

Ť

答案 1 :(得分:0)

当您需要从T-SQL读取文件系统时,我发现CLR具有最大的灵活性。它们使您可以完全访问system.io命名空间以及支持表值函数。

查看SQL Server CLR IO Utility。这里有一个完整的解决方案,可以使用frowned upon xp_cmdshell无法轻松获得文件系统功能。

表值函数SQLIO_fnGetFiles可用于连接到sys.master_files表并返回不再附加到数据库的文件。在此示例中,CLR部署到名为CLRS的数据库:

USE master

SELECT fs.PATH FileSystemPath
     , FileIsAttached = CASE WHEN d.name IS NULL THEN 'YES' ELSE 'NO' END
     , d.name DatabaseName
     , mf.name FileLogicalName
     , mf.physical_name DatabaseFilePath
     , FileType = CASE mf.type_desc WHEN 'ROWS' THEN 'DATA' ELSE mf.type_desc END

FROM CLRS.dbo.SQLIO_fnGetFiles('L:\MSSQL\','*df',1) fs
LEFT OUTER JOIN sys.master_files mf ON fs.PATH = mf.physical_name
LEFT OUTER JOIN sys.databases d ON d.database_id = mf.database_id

还有其他方法(powershell,.net,ssis,...)来实现这一目标。我的经验是,一旦部署IO Utility解决方案,您就会发现许多其他节省时间的用途。