使用SQL,如何检查具有特定名称的文件是否存在?

时间:2017-10-27 21:20:49

标签: sql command-line

我正在寻找使用sql查找文件夹中是否存在特定文件的方法。

我有以下文件: ABC.DEF.T123.A001.txt ABC.DEF.T456.A002.txt ABC.DEF.T789.A003.txt

我正在使用以下逻辑来查找文件A001是否存在

declare @fullPath varchar(200) = '\\mypath\filepath\'
declare @fileName varchar(200) = 'ABC.DEF.*.A001.txt'

EXEC master.dbo.xp_fileexist @fullPath, @exist OUTPUT
SET @exist = CAST(@exist AS BIT)

select @exist

当显示@exist的值时,我总是得到0,即使包含A002序列的文件存在。

我想我没有以正确的方式使用过滤器。

我做错了什么?

4 个答案:

答案 0 :(得分:1)

权限可能阻止访问目录....

使用Windows资源管理器时,它使用您的凭据访问目录/文件,而Sql Server将使用运行服务的凭据...可能有或无权访问文件共享。

如果您可以凭借域帐户访问该文件路径,则必须使用具有该文件共享权限的域帐户而不是默认的“网络服务”帐户运行Sql Server。

答案 1 :(得分:0)

声明@File_Exists INT

EXEC xp_fileexist'\ mypath \ filepath \ ABC.DEF。*。A001.txt',@ File_Exists OUT 选择@File_Exists

如果文件存在则返回1,如果文件不存在则返回0。要在SQL服务器上使用此代码,用户必须具有正确的权限,并且应该是服务器上的管理员。这不是最安全的解决方案 - 您可以使用的许多服务比这更安全。

答案 2 :(得分:0)

我们在检查存储文件的表时执行此操作,并且您要审核以确认文件在那里。您必须执行某种类型的循环  master.dbo.xp_fileexist存在 需要完整路径,因此文件夹+文件名

这是执行此操作的快速循环

将@exist声明为int     声明@fullPath varchar(200)     将@j声明为int = 0     将@Mj声明为int =(从具有文件名和路径的表中选择COUNT(File_name)个文件)

WHILE @j < @mj BEGIN
Set @j = @j+1
    Set @fullPath = (
        Select top 1 Folder+fname as photo 
        FROM (Select *, ROW_NUMBER() Over(order by Fname) RN FROM dbo.TABLE_with_files) A
        WHERE RN=@j ) 

    EXEC master.dbo.xp_fileexist @fullPath, @exist OUTPUT
    SET @exist = CAST(@exist AS BIT)
    if @exist = 0 BEGIN
        select * FROM dbo.TABLE_with_Files where Folder+fname = @fullPath collate database_Default

    END 


END -- while loop       

答案 3 :(得分:0)

如果文件夹的权限没问题,那么我就不会使用通配符。 为了使用通配符,我将打印表格中的所有文件并在那里搜索我想要查找的文件。

尝试像下面这样适应你的代码

DECLARE @FilesExist  INT = 0
       ,@BasePath VARCHAR(100) = '%Path to the folder+\%'

DECLARE @Files TABLE ([FileName] VARCHAR(100), Depth INT, [File] INT) 

INSERT INTO @Files
EXEC master.sys.xp_dirtree @BasePath,1,1;


SELECT TOP 1 @FilesExist = 1
FROM @Files
WHERE EXISTS ( SELECT 1 
               FROM @Files
               WHERE [FileName] LIKE '%yourFileNameUsingWildcardsOrNot%')
OR EXISTS (  SELECT 1 
               FROM @Files
               WHERE [FileName] LIKE '%yourFileName2UsingWildcardsOrNot%')

               
SELECT @FilesExist

根据标志,您可以决定接下来的流程 我希望它有所帮助。