Передача параметров в хранимую процедуру для просмотра папок в Windows Server 2008 и Windows Server 2016 - PullRequest
0 голосов
/ 18 октября 2018

У меня есть хранимая процедура, которая вызывается из задания SQL Server.

Следующие параметры передаются из задания в хранимую процедуру для просмотра общего ресурса с несколькими подпапками с файлами внутри них.на сервере 2008 против сервера 2016 года.

Этот сбой и возвращает тип в качестве типа имени файла \ 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)

Может бытьгораздо более простой способ передачи местоположений файлов в базу данных.

Открыть для предложений.

Спасибо за ваше время!

...