У меня есть хранимая процедура, которая вызывается из задания 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)
Может бытьгораздо более простой способ передачи местоположений файлов в базу данных.
Открыть для предложений.
Спасибо за ваше время!