2017-03-08 1 views
0

以下のスクリプトを使用して、別のテーブルからパス情報を読み込み、sp_OAGetPropertyを使用して変数を設定し、表。スクリプトは、255(ディレクトリとファイルを含むルックアップテーブルの行640について)を挿入し、新しいテーブルのすべての行に無限に255行のエントリを入れてループするまでうまく動作します。私はこれが何か、多分SQL設定/オプションの多分、多分OLE関連、おそらくウィンドウの制限だと思っていますか?ここでは、助けてください、私が持っているものである:ここでは は、私が話していた出力部である:OLEを使用してファイルデータを取得し、テーブルに入力するSQLスクリプトは、行255まで正常に動作します。

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...\954012.dwg  
251 954013.dwg D:\Data\GS...\954013.dwg  
252 954014-A.dwg D:\Data\GS...\954014-A.dwg 
253 954015-A.dwg D:\Data\GS...\954015-A.dwg 
254 954016-A.dwg D:\Data\GS...\954016-A.dwg 
255 954017-A.dwg D:\Data\GS...\954\954017-A.dwg 
256 954017-A.dwg D:\Data\GS...\954\954017-A.dwg 

954017-ちょうど私は、クエリを殺すまで繰り返し続けます。 ..返されたデータに長いパス文字列があり、私は上記のファイル名とほとんど同じです...何が欠けていますか?

+0

開始/終了のペアを強調表示するようにコードを編集しました。 'SELECT @Counter = @Counter + 1'の後ろに' PRINT @ Counter'を追加すると助けになるかもしれません –

+0

'DECLARE @ Counter'コードはどこですか? '@ Counter'はどのデータ型ですか? 'INT'でなければなりません –

答えて

0

私は、MAX_ODSOLE_OBJECTS設定が内部的に255であることを知りました。これは、255よりもOA SPを呼び出すことができないことを意味します。ループの最後にEXEC sp_OADestroy呼び出しを追加しましたしたがって、OA SPは反復ごとに最大9回呼び出されるだけです。魅力的な作品! CURSORヘルプTomに感謝します。

0

私は助けることができますが、パフォーマンスを助け、おそらくあなたが持っている問題を修正する必要があります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'への依存。あなたの問題を解決するだけかもしれません。

関連する問題