SQL〜查询网络上远程节点的文件系统上的目录

问题描述:

我需要在SQL中查询文件列表,它们的字节以及它们的文件扩展名。这些文件位于不在SQL服务器上的目录中,而是位于网络中的另一台机器节点上。我已经看到一些解决方案,如“EXEC xp_dirtree'C:\',10,1”,但这些只能获得文件名。我也需要文件字节。此外,该解决方案只适用于查询安装sql server实例的计算机,它不适用于网络上的远程计算机(即使使用完全限定路径)。SQL〜查询网络上远程节点的文件系统上的目录

+4

SQL Server并不完全是为了枚举远程节点的文件系统而设计的......您想要实现什么功能?你不能在C#,PHP中的某些前端/服务层软件中执行此操作 - 然后将结果存储到SQL Server中? –

+1

也许这是一个XY问题,如http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem中所述? – tucaz

+0

不,这是我需要的行为。我们有一个虚拟专用网络,在这个网络中,需要这些数据的服务器只能通过VPN与另一个可以访问这些数据的sql服务器进行通信。通信是通过远程过程调用完成的。因此,基本上,需要数据的服务器无法访问数据,只能访问可访问数据的真实服务器。此外,我需要实时数据,因此有其他批处理作业来处理它不会工作 – MobileMon

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才能访问文件系统,因此在您的环境中可能无法实现。