从文件夹和子文件夹中获取独立数据库的脚本



是否有一种方法可以找出SQL Server数据库是否是从目录附加了带有许多子文件夹的目录,除了转到每个.mdf的属性并检查其是否附加?

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

谢谢大家。

这应该很容易做到:

首先,我会查询数据库服务器sysdatabase表以找到您已连接的所有数据库,并在其中附加了相应的文件名,并存储在临时表中。

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

比较这些表,您将能够找到未连接的文件。

我之前已经执行了类似的任务,并且同时使用了SSIS和Direct Transact-SQL

t

当您需要从t-sql读取文件系统时,我发现CLR具有最大的灵活性。它们使您可以完全访问System.io名称空间以及对表有价值功能的支持。

看看SQL Server CLR IO实用程序。这里有一个完整的解决方案,可以启用文件系统功能,而XP_CMDSHELL上的皱眉很难获得。

表值函数SQLIO_FNGETFILE可用于连接到SYS.Master_Files表和返回不再附加到数据库的文件。在此示例中,将CLR部署到名为CLR的数据库:

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公用事业解决方案,您就会发现其他许多节省时间的用途。

相关内容

最新更新