有没有办法找出SQL Server数据库是否从包含许多子文件夹的目录附加,除了转到每个.mdf的属性并检查它是否已附加?
是否有一个脚本可以检查文件夹/子文件夹是否写入文件来完成此操作?
感谢所有。
答案 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解决方案,您就会发现许多其他节省时间的用途。