已经询问了对此的变化。使用以下代码搜索本地目录没有问题。
EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1
当我将路径切换到网络位置时,结果为空。
EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1
我首先认为这可能与权限有关。我将 SQL Server 服务添加到共享卷和安全组的 ACL 列表中。
非常感谢任何指向我的帮助或指导,甚至是另一种获取目录和子目录中文件列表的方法。
[已编辑]
已经询问了对此的变化。使用以下代码搜索本地目录没有问题。
EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1
当我将路径切换到网络位置时,结果为空。
EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1
我首先认为这可能与权限有关。我将 SQL Server 服务添加到共享卷和安全组的 ACL 列表中。
非常感谢任何指向我的帮助或指导,甚至是另一种获取目录和子目录中文件列表的方法。
[已编辑]
需要注意的两件事是:
确保 SQL Server 服务(服务列表中通常列为“SQL Server (MSSQLSERVER)”的服务)的登录帐户对该网络共享具有权限。
更新
问题最终是 OP 将 SQL Server 服务作为本地系统帐户运行。因此,OP 为 SQL Server 创建了一个域帐户,将该新域帐户分配为 SQL Server 服务的登录身份帐户,并授予该域帐户适当的 NTFS 权限。
请注意,通过将运行 SQL Server 的服务器本身添加到 NTFS 权限,在保持 SQL 服务作为本地系统帐户运行的同时,这也可能是可修复的。这通常可以通过指定服务器名称后跟美元符号 ($) 来实现。例如:
MySqlServer01$
。当然,这会为该服务器上作为本地系统帐户运行的所有服务授予 NTFS 权限,这可能是不可取的。因此,最好为 SQL Server 服务创建一个域帐户来运行(无论如何这都是一个好习惯!)。
听起来这已经完成了,因此应该通过以该帐户直接登录到 Windows 并尝试转到该特定网络路径来对其进行测试。
确保正在执行的 SQL Server 中的登录xp_dirtree
具有“sysadmin”权限:
这可以通过将帐户添加到sysadmin
服务器角色来直接完成,或者
签署一个运行的存储过程xp_dirtree
:
sysadmin
服务器角色xp_dirtree
xp_dirtree
使用ADD SIGNATURE和刚刚恢复的证书对运行的存储过程进行签名顺便说一句,另一种选择是xp_dirtree
完全取消,而是使用 SQLCLR。各种博客上可能都有示例 C# 代码。还有一些 CodePlex 项目具有文件系统功能,并且可能还为那些不想处理编译的人提供预编译的程序集。而且,还有一个SQL#库,它有几个文件系统函数,包括File_GetDirectoryListing
哪个是 TVF(意思是:您可以在带有 WHERE 条件的 SELECT 语句中使用它,而不需要先将所有列和所有行转储到临时表中) . 它也是完全流式传输的,这意味着它非常快,即使对于 100k 或更多文件也是如此。请注意,FILE_*
函数只有完整版(即不是免费的),我是 SQL# 的创建者,但它确实很好地处理了这种情况。