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