SQL〜查询网络上远程节点的文件系统上的目录
问题描述:
我需要在SQL中查询文件列表,它们的字节以及它们的文件扩展名。这些文件位于不在SQL服务器上的目录中,而是位于网络中的另一台机器节点上。我已经看到一些解决方案,如“EXEC xp_dirtree'C:\',10,1”,但这些只能获得文件名。我也需要文件字节。此外,该解决方案只适用于查询安装sql server实例的计算机,它不适用于网络上的远程计算机(即使使用完全限定路径)。SQL〜查询网络上远程节点的文件系统上的目录
答
CLR存储过程最适合这样的任务。
也看到this SO Answer,有一些你需要的代码。这个创建一个CLR函数(代码粘贴在下面)。
public partial class UserDefinedFunctions
{
[SqlFunction(DataAccess = DataAccessKind.Read,
FillRowMethodName = "GetFiles_FillRow", TableDefinition = "FilePath nvarchar(4000)")]
public static IEnumerable GetFiles(SqlString path)
{
return System.IO.Directory.GetFiles(path.ToString()).Select(s => new SqlString(s));
}
public static void GetFiles_FillRow(object obj,out SqlString filePath)
{
filePath = (SqlString)obj;
}
};
答
如果CLR是不是你的服务器上启用,并xp_cmdshell的是,你可以考虑使用此解析DIR命令 - 但要知道,xp_cmdshell的是默认关闭的一个原因。
您可以在文件大小here和关于如何使用here的博客文章中找到关于如何使用xp_cmdshell的讨论。您可能需要管理员根据this MSDN page上的说明在目标服务器上配置代理帐户。
我建议您首先浏览CLR选项,因为它更安全且更易于审计解决方案,但由于您可能需要external access permission set才能访问文件系统,因此在您的环境中可能无法实现。
SQL Server并不完全是为了枚举远程节点的文件系统而设计的......您想要实现什么功能?你不能在C#,PHP中的某些前端/服务层软件中执行此操作 - 然后将结果存储到SQL Server中? –
也许这是一个XY问题,如http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem中所述? – tucaz
不,这是我需要的行为。我们有一个虚拟专用网络,在这个网络中,需要这些数据的服务器只能通过VPN与另一个可以访问这些数据的sql服务器进行通信。通信是通过远程过程调用完成的。因此,基本上,需要数据的服务器无法访问数据,只能访问可访问数据的真实服务器。此外,我需要实时数据,因此有其他批处理作业来处理它不会工作 – MobileMon