1

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

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

谢谢大家。

4

2 回答 2

1

这应该很容易做到:

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

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

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

我之前做过类似的任务,同时使用过 SSIS 和 Direct Transact-SQL

于 2012-11-08T15:39:50.907 回答
0

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

查看SQL Server CLR IO 实用程序这里有一个完整的解决方案,它启用了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

There are also other methods (powershell, .net, ssis,...) to accomplish this. My experience is that once you deploy the IO Utility solution, you'll find many other time saving uses for it.

于 2012-11-08T16:51:59.183 回答