SQL 使用 OLE 获取文件数据并输入到 table 的脚本在第 255 行之前工作正常
SQL script using OLE to get file data and input into a table works fine until row 255
我在下面有一个脚本,它从单独的 table 读取路径信息,然后使用 sp_OAGetProperty 填充变量,然后我将数据插入 table。该脚本工作正常,直到我插入 255(大约是查找 table 中的第 640 行,其中包括目录和文件)然后它只是无休止地循环将第 255 行条目放入新 table。我怀疑这是某种限制,也许是 sql setting/option,也许是 ole 相关,也许是 windows?请帮助,这是我所拥有的:
这是我正在谈论的输出部分:
Select * FROM FullDirectoryTree
SET @DirTreeCount = @@ROWCOUNT
SET @Counter = 1
EXEC dbo.sp_OACreate 'Scripting.FileSystemObject', @ObjFileSystem OUT
WHILE @Counter <= @DirTreeCount
BEGIN
SELECT @CurrentName = subdirectory,
@IsFile = Is_File
FROM FullDirectoryTree
WHERE RowNum = @Counter
IF @IsFile = 1 AND @CurrentName LIKE '%%'
BEGIN
EXEC dbo.sp_OAMethod @ObjFileSystem,'GetFile', @ObjFile OUT, @CurrentName
EXEC dbo.sp_OAGetProperty @ObjFile, 'Path', @Path OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'ShortPath', @ShortPath OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'Name', @Name OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'ShortName', @ShortName OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateCreated', @DateCreated OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateLastAccessed', @DateLastAccessed OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateLastModified', @DateLastModified OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'Size', @Size OUT
INSERT INTO FileDetails
(Path, ShortPath, Name, ShortName, DateCreated,
DateLastAccessed, DateLastModified, Size)
SELECT @Path,@ShortPath,@Name,@ShortName,@DateCreated,
@DateLastAccessed,@DateLastModified,@Size
END
SELECT @Counter = @Counter + 1
END
EXEC sp_OADestroy @ObjFileSystem
EXEC sp_OADestroy @ObjFile
示例数据:
Rownum Name Path
249 954011.dwg D:\yadayadayada.dwg
250 954012.dwg D:\Data\GS...4012.dwg
251 954013.dwg D:\Data\GS...4013.dwg
252 954014-A.dwg D:\Data\GS...4014-A.dwg
253 954015-A.dwg D:\Data\GS...4015-A.dwg
254 954016-A.dwg D:\Data\GS...4016-A.dwg
255 954017-A.dwg D:\Data\GS...44017-A.dwg
256 954017-A.dwg D:\Data\GS...44017-A.dwg
954017-A 一直重复,直到我终止查询...我在返回的数据中有更长的路径字符串,并且上面的文件名几乎相同...我错过了什么?
我忍不住认为您应该将其更改为 CURSOR,这应该有助于提高性能并可能解决您遇到的问题:
EXEC dbo.sp_OACreate 'Scripting.FileSystemObject', @ObjFileSystem OUT
DECLARE C CURSOR FOR SELECT subdirectory, Is_File FROM FullDirectoryTree;
OPEN c;
FETCH NEXT FROM C INTO @CurrentName, @IsFile;
WHILE @@FETCH_STATUS = 0 BEGIN
...
FETCH NEXT FROM C INTO @CurrentName, @IsFile;
END
CLOSE c;
DEALLOCATE c;
这将消除对 FullDirectoryTree 的重复查询,并消除对 [RowNum]
、@Counter
和“@DirTreeCount”的依赖。也可以解决您的问题。
我研究了很多,最后发现有一个 MAX_ODSOLE_OBJECTS 内部设置为 255,这意味着你不能调用 OA sp 的次数超过 255。我刚刚添加了 EXEC sp_OADestroy 在循环结束时调用,因此 OA sp 每次迭代最多只被调用 9 次。奇迹般有效!感谢 CURSOR 帮助汤姆!
我在下面有一个脚本,它从单独的 table 读取路径信息,然后使用 sp_OAGetProperty 填充变量,然后我将数据插入 table。该脚本工作正常,直到我插入 255(大约是查找 table 中的第 640 行,其中包括目录和文件)然后它只是无休止地循环将第 255 行条目放入新 table。我怀疑这是某种限制,也许是 sql setting/option,也许是 ole 相关,也许是 windows?请帮助,这是我所拥有的: 这是我正在谈论的输出部分:
Select * FROM FullDirectoryTree
SET @DirTreeCount = @@ROWCOUNT
SET @Counter = 1
EXEC dbo.sp_OACreate 'Scripting.FileSystemObject', @ObjFileSystem OUT
WHILE @Counter <= @DirTreeCount
BEGIN
SELECT @CurrentName = subdirectory,
@IsFile = Is_File
FROM FullDirectoryTree
WHERE RowNum = @Counter
IF @IsFile = 1 AND @CurrentName LIKE '%%'
BEGIN
EXEC dbo.sp_OAMethod @ObjFileSystem,'GetFile', @ObjFile OUT, @CurrentName
EXEC dbo.sp_OAGetProperty @ObjFile, 'Path', @Path OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'ShortPath', @ShortPath OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'Name', @Name OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'ShortName', @ShortName OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateCreated', @DateCreated OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateLastAccessed', @DateLastAccessed OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'DateLastModified', @DateLastModified OUT
EXEC dbo.sp_OAGetProperty @ObjFile, 'Size', @Size OUT
INSERT INTO FileDetails
(Path, ShortPath, Name, ShortName, DateCreated,
DateLastAccessed, DateLastModified, Size)
SELECT @Path,@ShortPath,@Name,@ShortName,@DateCreated,
@DateLastAccessed,@DateLastModified,@Size
END
SELECT @Counter = @Counter + 1
END
EXEC sp_OADestroy @ObjFileSystem
EXEC sp_OADestroy @ObjFile
示例数据:
Rownum Name Path
249 954011.dwg D:\yadayadayada.dwg
250 954012.dwg D:\Data\GS...4012.dwg
251 954013.dwg D:\Data\GS...4013.dwg
252 954014-A.dwg D:\Data\GS...4014-A.dwg
253 954015-A.dwg D:\Data\GS...4015-A.dwg
254 954016-A.dwg D:\Data\GS...4016-A.dwg
255 954017-A.dwg D:\Data\GS...44017-A.dwg
256 954017-A.dwg D:\Data\GS...44017-A.dwg
954017-A 一直重复,直到我终止查询...我在返回的数据中有更长的路径字符串,并且上面的文件名几乎相同...我错过了什么?
我忍不住认为您应该将其更改为 CURSOR,这应该有助于提高性能并可能解决您遇到的问题:
EXEC dbo.sp_OACreate 'Scripting.FileSystemObject', @ObjFileSystem OUT
DECLARE C CURSOR FOR SELECT subdirectory, Is_File FROM FullDirectoryTree;
OPEN c;
FETCH NEXT FROM C INTO @CurrentName, @IsFile;
WHILE @@FETCH_STATUS = 0 BEGIN
...
FETCH NEXT FROM C INTO @CurrentName, @IsFile;
END
CLOSE c;
DEALLOCATE c;
这将消除对 FullDirectoryTree 的重复查询,并消除对 [RowNum]
、@Counter
和“@DirTreeCount”的依赖。也可以解决您的问题。
我研究了很多,最后发现有一个 MAX_ODSOLE_OBJECTS 内部设置为 255,这意味着你不能调用 OA sp 的次数超过 255。我刚刚添加了 EXEC sp_OADestroy 在循环结束时调用,因此 OA sp 每次迭代最多只被调用 9 次。奇迹般有效!感谢 CURSOR 帮助汤姆!