1

SQL 服务器存在于我物理登录的同一台机器上,并且 xp_fileexist 无法识别 D 驱动器(不是网络驱动器)上的任何文件。我已经配置了 xp_cmdshell 并重新启动了 SQL 服务器实例。还有其他想法吗?

4

1 回答 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 回答