无法使用SQL xp_smdshell命令在文件夹中获取正确的文件

时间:2017-10-09 18:58:38

标签: sql-server tsql command-line

我的计算机文件夹中有以下名称的文件:

XXX.IN.txt
YYY.TEST.NUM.txt
ABC.AA.Z100.X.E999567777.Y001.txt
ABC.AA.Z100.X.E999568888.Y002.txt
ABC.AA.Z100.X.E999568888.Y003.txt

我想编写一个SQL语句,将具有上述结构的文件插入到表中,以便稍后我可以在其上写一些逻辑。

我已经在我的存储过程中使用了命令行语句来检查文件是否存在:

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

现在,我需要在名称中找到包含字符串的某些文件。我有声明要这样做:

DECLARE @cmdLine VARCHAR(200)
DECLARE @fullPath VARCHAR(900) = '\\my_network_path\MyDir\'
DECLARE @filter VARCHAR(100) = 'ABC.AA.Z100.X.*.txt'

SET @cmdLine = 'dir "' + @fullPath + '"' 
EXEC master..xp_cmdshell @cmdLine 

上面的命令应该给我以下文件:

ABC.AA.Z100.X.E999567777.Y001.txt
ABC.AA.Z100.X.E999568888.Y002.txt
ABC.AA.Z100.X.E999568888.Y003.txt

CREATE TABLE #FileDetails
(
    data VARCHAR(MAX)
)
INSERT #FileDetails(data) EXEC master..xp_cmdshell @cmdLine

但它列出了文件夹

中的所有.txt个文件

我该如何列出我需要的那些文件

2 个答案:

答案 0 :(得分:1)

首先,@ cmdline应设置为高于@fullpath,因为它最终应该适合所有它。

其次,除非我看错了或者你没有在这里纠正它,否则@filter变量不会被使用,所以它会显示每个文件而不管扩展名。

我的代码:

DECLARE @cmdLine VARCHAR(2000)
DECLARE @fullPath VARCHAR(1000) = '\\my_network_path\MyDir\'
DECLARE @filter VARCHAR(100) = 'ABC.AA.Z100.X.*.txt'

SET @cmdLine = 'dir "' + @fullPath + @filter + '"' 
EXEC master..xp_cmdshell @cmdLine 

我的输出(请记住我在同一个文件夹中创建了一个Test.txt):

10-10-2017  12:17                 0 ABC.AA.Z100.X.Y001.txt
10-10-2017  12:18                 0 ABC.AA.Z100.X.Y002.txt
10-10-2017  12:18                 0 ABC.AA.Z100.X.Y003.txt

答案 1 :(得分:0)

我会使用CLR proc或SSIS脚本来执行此操作,该脚本使用FileSystemObject迭代文件,过滤所需的文件并构建SQL字符串并执行它。

我不知道用直接的TSQL做任何你想做的事情。