我有一个从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表的结果:
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)
将文件位置传递到数据库可能有一种更简单的方法。
接受建议。
感谢您的时间!