将参数传递给存储过程以查看Windows Server 2008和Windows Server 2016上的文件夹

时间:2018-10-18 16:04:02

标签: sql windows-server-2008 windows-server-2016

我有一个从SQL Server作业中调用的存储过程。

以下参数从作业传递到存储过程,以查找包含多个子文件夹的共享文件。在2008服务器与2016服务器之间。

此操作失败,并返回Type作为文件名type \ filename

EXECUTE StoredProcedure '\\Server2016\Public\"File Uploads"', uploadfilelist, '%.%', NULL, 1

这个很好用。

EXECUTE StoredProcedure '\\Server2008\Public\"File Uploads"', uploadfilelist, '%.%', NULL, 1
  • 在Windows Server 2008上运行该过程时,效果很好
  • 当该过程再次运行Windows Server 2016时,它无法返回文件类型,为空白。然后,文件类型将合并为文件名。

这两个输出的示例如下所示,它们是Windows Server 2008表的结果:

Filelist - Type - filename - file_ext

\server2008\Public\File Uploads\subfolder1\filename.pdf - subfolder1    - filename - pdf

Windows Server 2016表的结果:

Filelist - Type - filename - file_ext

\server2008\Public\File Uploads\subfolder1\filename.pdf - no data - subfolder1\filename - pdf

我知道您在说什么,请将共享文件夹保留在2008年的框中,并称之为周末。是的,可以使用,但是2016服务器速度很快!并且有更多空间。

还请注意,SQL Server方面没有任何变化-另一个框中是SQL Server 2017。

该过程正在做的是获取文件路径,类型,文件名和文件ext,并将这些数据放在SQL Server数据库表中作为参考。

这就是存储过程的样子。

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[StoredProcedure]
    @PCWrite VARCHAR(2000),
    @DBTable VARCHAR(100) = NULL,
    @PCIntra VARCHAR(100) = NULL,
    @PCExtra VARCHAR(100) = NULL,
    @DBUltra BIT = 0
AS
   SET NOCOUNT ON

   DECLARE @Return INT 
   DECLARE @Retain INT 
   DECLARE @Status INT 

   SET @Status = 0

   DECLARE @Task VARCHAR(2000)
   DECLARE @Work VARCHAR(2000)
   DECLARE @Wish VARCHAR(2000)

   --SET @Work =  '"' + 'DIR /s ' + @PCWrite + '"'
   SET @Work =  '"' + 'DIR /b /s ' + @PCWrite + '"'

   --PRINT @Work
   EXEC sp_xp_cmdshell_proxy_account  'Administrator\admin' , ‘password' 

   DROP TABLE IF EXISTS #DBAZ

   CREATE TABLE #DBAZ (Name varchar(400), Work int IDENTITY(1,1))

   INSERT #DBAZ 
       EXECUTE @Return = master.dbo.xp_cmdshell @Work

   SELECT *
   FROM #DBAZ

   SET @Retain = @@ERROR
   --IF @Status = 0 SET @Status = @Retain

   IF @Status = 0 
       SET @Status = @Return

   IF (SELECT COUNT(*) FROM #DBAZ) < 4
   BEGIN
       SELECT @Wish = Name 
       FROM #DBAZ 
       WHERE Work = 1

       IF @Wish IS NULL
       BEGIN
           RAISERROR ('General error [%d]',16,1,@Status)
       END
       ELSE
       BEGIN
           RAISERROR (@Wish,16,1)
       END
    END
    ELSE
    BEGIN
        --DELETE #DBAZ WHERE ISDATE(SUBSTRING(Name,1,10)) = 0 OR SUBSTRING
        --(Name,40,1) = '.' OR Name LIKE '%.lnk'
        IF @DBTable IS NULL
        BEGIN
            SELECT SUBSTRING(Name, 40, 100) AS Files
            FROM #DBAZ
            WHERE 0 = 0
              AND (@DBUltra = 0 OR Name LIKE '% %')
              AND (@DBUltra != 0 OR Name NOT LIKE '% %')
              AND (@PCIntra IS NULL OR SUBSTRING(Name, 40, 100) LIKE @PCIntra)
              AND (@PCExtra IS NULL OR SUBSTRING(Name, 40, 100) NOT LIKE @PCExtra)
            ORDER BY 1
        END
        ELSE
           -- this is where the db table gets updated.  Need to delete all data first.
        BEGIN
            -- delete the data in the table
            SET @Task = ' DELETE FROM ' + REPLACE(@DBTable,CHAR(32),CHAR(95))

            IF @Status = 0  
               EXECUTE (@Task) SET @Return = @@ERROR

            IF @Status = 0 
               SET @Status = @Return

            -- insert the new values
            SET @Task = ' INSERT ' + REPLACE(@DBTable,CHAR(32),CHAR(95))
                + ' SELECT Name AS filelist, '
                + 'SUBSTRING(Name,34, CHARINDEX(' + CHAR(39) + '\' + CHAR(39) + ', Name, 34) - 34 ) as type, '
                --+ '400 as type, '
                + 'SUBSTRING(Name, CHARINDEX(' + CHAR(39) + '\' + CHAR(39) + ', Name, 34) + 1, CHARINDEX(' + CHAR(39) + '.' + CHAR(39) + ', Name) - CHARINDEX(' + CHAR(39) + '\' + CHAR(39) + ', Name, 34) -1) as        filename, '
                --+ '300 as filename, '
                + 'RIGHT(Name, 3) as file_ext'
                --+ ' SELECT SUBSTRING(Name,40,100) AS Files' – ORIGINAL
                + ' FROM #DBAZ'
                + ' WHERE 0 = 0'
                + CASE WHEN @DBUltra = 0 THEN '' ELSE ' AND Name LIKE ' + CHAR(39) + '% %' + CHAR(39) END 
                + CASE WHEN @DBUltra != 0 THEN '' ELSE ' AND Name NOT LIKE ' + CHAR(39) + '%  %' + CHAR(39) END
                + CASE WHEN @PCIntra IS NULL THEN '' ELSE ' AND SUBSTRING (Name, 40, 100) LIKE ' + CHAR(39) +    @PCIntra + CHAR(39) END
                + CASE WHEN @PCExtra IS NULL THEN '' ELSE ' AND SUBSTRING (Name, 40, 100) NOT LIKE ' + CHAR(39) + @PCExtra + CHAR(39) END
                + ' ORDER BY 1'

            IF @Status = 0 
                EXECUTE (@Task) 

            SET @Return = @@ERROR

            IF @Status = 0 
                SET @Status = @Return
        END
    END

    DROP TABLE #DBAZ

    SET NOCOUNT OFF

    RETURN (@Status)

将文件位置传递到数据库可能有一种更简单的方法。

接受建议。

感谢您的时间!

0 个答案:

没有答案