Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL~查询网络上远程节点文件系统上的目录_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

Sql server SQL~查询网络上远程节点文件系统上的目录,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我需要在SQL中查询文件列表、它们的字节和文件扩展名。这些文件位于网络中的另一个计算机节点上,而不是SQL server上的目录中。我见过一些解决方案,如EXEC xp\u dirtree'C:\',10,1,但这些都只获得文件名。我也需要文件字节。此外,该解决方案仅在我查询安装了sql server实例的计算机时有效,即使使用完全限定路径,它也无法与网络上的远程计算机一起工作。CLR存储过程最适合执行此类任务 MSDN:。 如何: 还可以看到它包含了一些您需要的代码。这一个创建了粘贴在下面的C

我需要在SQL中查询文件列表、它们的字节和文件扩展名。这些文件位于网络中的另一个计算机节点上,而不是SQL server上的目录中。我见过一些解决方案,如EXEC xp\u dirtree'C:\',10,1,但这些都只获得文件名。我也需要文件字节。此外,该解决方案仅在我查询安装了sql server实例的计算机时有效,即使使用完全限定路径,它也无法与网络上的远程计算机一起工作。

CLR存储过程最适合执行此类任务

MSDN:。 如何: 还可以看到它包含了一些您需要的代码。这一个创建了粘贴在下面的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存储过程最适合这样的任务

MSDN:。 如何: 还可以看到它包含了一些您需要的代码。这一个创建了粘贴在下面的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,XPyCMDS壳是可以使用的,那么您可以考虑使用它来解析DIR命令——但是请注意,XPyCMDS壳默认情况下关闭是有原因的。 您可以找到一篇关于如何使用xp_cmdshell处理文件大小的讨论,以及一篇关于如何做到这一点的博客文章。您可能需要管理员根据上的说明在目标服务器上配置代理帐户


我建议您首先探索CLR选项,因为它是一种更安全、更容易审核的解决方案,但由于您可能需要访问文件系统,因此在您的环境中可能无法实现此功能。

如果您的服务器上未启用CLR,而xp\u cmdshell是,您可以考虑使用此来解析DIR命令——但请注意,默认情况下XPyCMDS壳是关闭的。 您可以找到一篇关于如何使用xp_cmdshell处理文件大小的讨论,以及一篇关于如何做到这一点的博客文章。您可能需要管理员根据上的说明在目标服务器上配置代理帐户


我建议您首先探索CLR选项,因为它是一种更安全、更容易审核的解决方案,但由于您可能需要访问文件系统,因此在您的环境中可能不可能实现这一点。

SQL Server并不是专为枚举远程节点的文件系统而设计的。。。。你想达到什么目标?难道你不能在一些前端/服务层软件中用C,PHP做这件事吗?不管怎样,然后把结果存储到SQL Server中?也许这是一个XY问题,如中所述?不,这是我需要的行为。我们有一个虚拟专用网络,其中需要此数据的服务器只能与另一台sql server通信,即通过VPN访问此数据的sql server。通信通过远程过程调用完成。因此,基本上,需要数据的服务器没有访问数据的权限,它只有访问数据的真实服务器的通信权限。另外,我还需要实时数据,因此如果有其他批处理作业来处理数据,则无法正常工作。您需要您的服务器请求另一台SQL server向第三台服务器查询文件系统信息吗?哇!你能向中间的第二个服务器添加对象吗?@ AnnL。是的,你理解这个问题。是的,我可以向中间服务器添加表或任何我喜欢的内容。SQL Server并不是专门为枚举远程节点的文件系统而设计的。。。。你想达到什么目标?难道你不能在一些前端/服务层软件中用C,PHP做这件事吗?不管怎样,然后把结果存储到SQL Server中?也许这是一个XY问题,如中所述?不,这是我需要的行为。我们有一个虚拟专用网络,其中需要此数据的服务器只能与另一台sql server通信,即通过VPN访问此数据的sql server。通信通过远程过程调用完成。因此,基本上,需要数据的服务器没有访问数据的权限,它只有访问数据的真实服务器的通信权限。另外,我还需要实时数据,因此如果有其他批处理作业来处理数据,则无法正常工作。您需要您的服务器请求另一台SQL server向第三台服务器查询文件系统信息吗?哇!你能向中间的第二个服务器添加对象吗?@ AnnL。是的,你理解这个问题。是的,我可以向中间服务器添加表或任何我喜欢的内容