我正在寻找使用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
序列的文件存在。
我想我没有以正确的方式使用过滤器。
我做错了什么?
答案 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
根据标志,您可以决定接下来的流程 我希望它有所帮助。