SQL 服务器存在于我物理登录的同一台机器上,并且 xp_fileexist 无法识别 D 驱动器(不是网络驱动器)上的任何文件。我已经配置了 xp_cmdshell 并重新启动了 SQL 服务器实例。还有其他想法吗?
问问题
5710 次
1 回答
1
是的,我们遇到了同样的问题。在 SQL Server 2008 上,我们的旧xp_fileexist
代码运行良好,但在 SQL Server 2012 上......不行。
如果我们xp_fileexist
以自己的身份(具有管理员权限)运行该命令,但当我们以 SQL Server 用户的身份运行该命令时(该用户不作为 Active Directory 用户存在),它会起作用。即使我们更改了该文件夹的安全性以提供Everyone
完全权限,xp_fileexist
也会失败,总是返回 0,就好像该文件夹中的文件不存在一样。
但是,起作用的是在存储过程中使用,dir
并测试文件是否以这种方式存在。(是的,我知道......我自己都在翻白眼......这很狡猾......)
这是我根据本网站上的建议编写的存储过程:
CREATE PROCEDURE [dbo].[DoesFileExist]
(
@directoryName NVARCHAR(500),
@filename NVARCHAR(500)
)
AS
BEGIN
-- Does a file exist in a particular folder ?
--
-- EXEC [dbo].[DoesFileExist] 'D:\MyFiles', 'SomeExcelFile.xls'
--
DECLARE @bFileExists INT
DECLARE @cmd nvarchar(300);
SELECT @cmd = 'dir ' + @directoryName + '\' + @filename;
DECLARE @dir TABLE ([output] varchar( 2000 ))
INSERT INTO @dir
EXEC master.dbo.xp_cmdshell @cmd;
-- Uncomment the following line, if you want to see what
-- a "dir" looks like from SQL Server !!
-- SELECT * FROM @dir
if EXISTS(SELECT * FROM @dir WHERE [output] LIKE '%' + @filename + '%' )
BEGIN
-- File *was* found in this folder
SET @bFileExists = 1
END
ELSE
BEGIN
-- File was NOT found in this folder
SET @bFileExists = 0
END
SELECT @bFileExists
END
您可以简单地通过传递文件夹名称和文件名来调用此 SP:
EXEC [dbo].[DoesFileExist] 'D:\MyFiles', 'SomeExcelFile.xls'
是的,奇怪的是,对于无法使用xp_fileexist
.
请记住,要使用此代码,您的 SQL Server 用户必须具有使用权限xp_cmdshell
:
GRANT EXECUTE ON xp_cmdshell TO YourSQLServerUser
于 2017-08-10T11:31:23.097 回答