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 帮助汤姆!