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

时间:2013-11-25 19:58:41

标签: sql-server sql-server-2008 tsql

我需要在SQL中查询文件列表,字节和文件扩展名。这些文件位于不在SQL服务器上的目录中,而是位于网络中的另一个计算机节点上。我见过一些解决方案,比如“EXEC xp_dirtree'C:\',10,1”,但这些只能得到文件名。我也需要文件字节。此外,该解决方案仅在我查询安装了sql server实例的计算机时才有效,它不适用于网络上的远程计算机(即使使用完全限定的路径)。

2 个答案:

答案 0 :(得分:3)

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;
    }
};

答案 1 :(得分:3)

如果服务器上没有启用CLR,并且xp_cmdshell是,则可以考虑使用它来解析DIR命令 - 但请注意,默认情况下xp_cmdshell是关闭的。

您可以找到有关如何将xp_cmdshell用于文件大小here的讨论以及有关如何执行此操作的博客文章here。您可能需要管理员根据this MSDN page上的说明在目标服务器上配置代理帐户。

我建议你首先探索CLR选项,因为它是一个更安全,更容易审计的解决方案,但是因为你可能需要external access permission set才能进入文件系统,这可能是不可能的你的环境。