Sql server 建议使用ewFileName.txt,因为它显示了在禁用xp_cmdshell时如何启用它(这是默认设置)。这段代码中有一个错误:执行ListPathsXML“D:\QAconfig\”,-----ListPathXML SP不存在于您要删除的文件夹Lis

Sql server 建议使用ewFileName.txt,因为它显示了在禁用xp_cmdshell时如何启用它(这是默认设置)。这段代码中有一个错误:执行ListPathsXML“D:\QAconfig\”,-----ListPathXML SP不存在于您要删除的文件夹Lis,sql-server,tsql,Sql Server,Tsql,建议使用ewFileName.txt,因为它显示了在禁用xp_cmdshell时如何启用它(这是默认设置)。这段代码中有一个错误:执行ListPathsXML“D:\QAconfig\”,-----ListPathXML SP不存在于您要删除的文件夹ListPathsXML“D:\QAconfig\”。我在这里提到了我的文件夹。请按照我上面提到的方式创建它,或者您可以在此查询中包含sp代码。好的,但我必须指定我的文件位于何处?当前位于此处:C:\MyFiles将此路径放在执行ListPathsX


建议使用ewFileName.txt,因为它显示了在禁用xp_cmdshell时如何启用它(这是默认设置)。这段代码中有一个错误:执行ListPathsXML“D:\QAconfig\”,-----ListPathXML SP不存在于您要删除的文件夹ListPathsXML“D:\QAconfig\”。我在这里提到了我的文件夹。请按照我上面提到的方式创建它,或者您可以在此查询中包含sp代码。好的,但我必须指定我的文件位于何处?当前位于此处:C:\MyFiles将此路径放在执行ListPathsXML“C:\MyFiles”处,然后进行检查。这段代码中有一个错误:执行ListPathsXML“D:\QAconfig\”,-----ListPathXML SP不存在于您要删除的文件夹ListPathsXML“D:\QAconfig\”。我在这里提到了我的文件夹。请按照我上面提到的方式创建它,或者您可以在此查询中包含sp代码。好的,但我必须指定我的文件位于何处?当前位于此处:C:\MyFiles将此路径放在EXECUTE ListPathsXML'C:\MyFiles',然后检查它。回答得很好!如果xp_cmdshell被禁用(默认设置),则可以通过结合有关如何打开该程序的说明(参见下面Praveen的回答)来稍微改进。另外,在master中调用存储的进程时,不需要完整的命名法(但我想它确实显示了它们的位置,如果有兴趣的话)。回答得很好!如果xp_cmdshell被禁用(默认设置),则可以通过结合有关如何打开该程序的说明(参见下面Praveen的回答)来稍微改进。另外,在master中调用存储的进程时,不需要完整的命名法(但我想它确实显示了它们的位置,如果有兴趣的话)。
update MyTable
set FileName= replace(FileName, '''', '')
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Declare @Directory TABLE (Files Varchar(MAX))
Declare @File TABLE (Name varchar(MAX))
INSERT INTO @Directory
EXEC XP_CMDSHELL 'DIR "D:"'
Insert into @File
Select reverse(LEFT(reverse(Files),charindex(' ' ,reverse(Files)))) from @Directory
Select * from  @FILE
CREATE PROCEDURE dbo.ListPathsXML
@FileSpec VARCHAR(2000),
@order VARCHAR (80) = '/O-D',--sort by date time oldest first
@xmlFileList XML OUTPUT

AS
DECLARE @myfiles TABLE (MyID INT IDENTITY(1,1) PRIMARY KEY, FullPath VARCHAR(2000))
DECLARE @CommandLine VARCHAR(4000)
IF @order IS NOT NULL -- abort if the order is silly
   BEGIN
   SELECT @CommandLine =LEFT('dir "' + @FileSpec + '" /A-D /B /S '+@order,4000)
   INSERT INTO @MyFiles (FullPath)
       EXECUTE xp_cmdshell @CommandLine
   DELETE FROM @MyFiles WHERE fullpath IS NULL
       OR fullpath = 'File Not Found'
   END
SET @xmlFileList = (SELECT fullpath FROM @MyFiles
                         FOR
                          XML PATH('thefile'),
                              ROOT('thefiles'),
                              TYPE)
DECLARE @LotsOfText NVARCHAR(MAX),
       @ii INT,
       @iiMax INT,
       @File VARCHAR(2000),
       @Command NVARCHAR(4000)
DECLARE @files TABLE (MyID INT IDENTITY(1,1) PRIMARY KEY, [Path] VARCHAR(2000))

DECLARE @FileList XML
EXECUTE ListPathsXML 'D:\QAconfig\',
    DEFAULT , @XMLFileList = @FileList OUTPUT

INSERT INTO @files(path)
   SELECT   x.thefile.value('fullpath[1]', 'varchar(2000)') AS [path]
        FROM    @FileList.nodes('//thefiles/thefile') AS x ( thefile )
--don't look at the current errorlog!
SELECT @ii=1, @iiMax=MAX(MyID) FROM @Files
WHILE @ii<=@iiMax
   BEGIN
   SELECT @File= [path] FROM @files WHERE MyID=@ii
   print @File
   SELECT @command='EXEC master..xp_cmdshell' + '''MOVE '+ Replace(@FILE,'''','''''') + ' ' +REPLACE(@FILE,'''','') +''''
   print @command
   EXECUTE sp_ExecuteSQL @command--, N'@lotsOfText nvarchar(max) output ',@lotsoftext output 
   SELECT @ii=@ii+1
   END
SET NOCOUNT ON;

 CREATE TABLE #FileList
    (
     FileID INT IDENTITY(1, 1)
    ,Line VARCHAR(512)
    )  

 CREATE TABLE #temp
    (
     isFileThere BIT
    ,isDirectory BIT
    ,parentDirExists BIT
    )

 DECLARE @Command VARCHAR(1024)
 ,  @RowCount INT
 ,  @counter INT
 ,  @FileName VARCHAR(1024)
 ,  @FileExists BIT
 SET @Command = 'dir C:\MyFiles\  /A-D  /B'

 PRINT @Command
 INSERT #FileList
        EXEC master.dbo.xp_cmdshell @Command

 DELETE FROM #FileList
 WHERE  Line IS NULL

 SELECT @RowCount = COUNT(*)
 FROM   [#FileList]

 SET @counter = 1

 WHILE ( @counter <= @RowCount ) 
    BEGIN
        SELECT  @FileName = [Line]
        FROM    [#FileList]
        WHERE   [FileID] = @counter 

        SET @Command = 'C:\MyFiles\' + @FileName + ''

 PRINT @Command

        INSERT  [#temp]
                EXEC master.dbo.xp_fileExist @Command

        SELECT  @FileExists = [isFileThere]
        FROM    [#temp] 


        IF @FileExists = 1
            AND CHARINDEX('''', @FileName) > 0 
            SET @Command = 'REN "C:\MyFiles\' + @FileName + '" "'
                + REPLACE(@FileName, '''', '') + '"'
        ELSE 
            SET @Command = ''

        SET @counter = @counter + 1

        PRINT @Command

        IF LEN(@Command) > 0 
            EXEC master.dbo.xp_cmdshell @Command

    END 

 DROP TABLE #FileList

 DROP TABLE [#temp]