0

SSIS を使用してフォルダーを反復処理し、すべての txt ファイルの内容をデータベースに読み取ります。まず、ストアド プロシージャを使用してファイルが既に処理されているかどうかを確認しています。

ALTER PROC [dbo].[CheckForDuplicateFileEntry]
(
  @TaskID INT,
  @Filename VARCHAR(50),
  @FileAlreadyExists BIT OUTPUT
)AS 
BEGIN

    DECLARE @TaskTypeID INT
    SET @FileAlreadyExists = 0

    SELECT @TaskTypeID = TaskTypeID FROM Tasks WHERE TaskID = @TaskID

    IF EXISTS ( SELECT  TaskID
                FROM    TaskSteps
                WHERE   @Filename IN (
                        SELECT TOP ( 30 )
                                TaskSteps.Filename
                        FROM    TaskSteps
                                INNER JOIN Tasks ON TaskSteps.TaskID = Tasks.TaskID
                        WHERE   ( Tasks.TaskTypeID = @TaskTypeID
                                  AND [Filename] IS NOT NULL
                                )
                                AND IsValid = 1
                                AND ProcessStatusID = 2 ) ) 
        BEGIN              
            INSERT  INTO TaskSteps ( TaskID, StepDesc )
            VALUES  (
                      @TaskID,
                      'Duplicate filename. (' + @Filename + ') Already exists.' 
                    )                
            SET @FileAlreadyExists = 1                  
        END        
END

私も試してみました

IF EXISTS (SELECT TOP 30 Filename
       FROM  TaskSteps  INNER JOIN Tasks ON TaskSteps.TaskID = Tasks.TaskID
       WHERE (SUBSTRING(TaskSteps.Filename,18,13) = SUBSTRING(@Filename,18,13))
             AND IsValid = 1                            
             AND ProcessStatusID = 2)

しかし、ファイルを反復処理すると、最初に処理され、次が重複であると宣言され、3 番目が処理され、4 番目が重複であると宣言されるなど、ファイル名は非常に似ています。その部分だけが変更され、おそらく 1 桁だけ変更されます。つまり、Songs_120502_175535.txt です。

4

2 に答える 2

1

これは私が得ることができるのと同じくらい簡単です。SSIS プロセスまたはトリガーなどの他の何か) が TaskSteps/Task テーブルを削除または更新していないかどうかを確認します。これらはクエリで使用されるため、IsValidおよび列も確認してください。ProcessStatusID同じパラメーターを使用して Management Studio でクエリを 3 回、4 回、5 回実行し、@FileAlreadyExistsそれぞれの後に値を出力してみてください。proc を呼び出すだけで正しく動作する場合、問題は SSIS の別の場所にあります。

ALTER PROC [dbo].[CheckForDuplicateFileEntry]
(
  @TaskID INT,
  @Filename VARCHAR(50),
  @FileAlreadyExists BIT OUTPUT
)AS 
BEGIN

SET @FileAlreadyExists = 0

IF EXISTS( 
           SELECT     * 
           FROM       TaskSteps
           INNER JOIN Tasks 
           ON         TaskSteps.TaskID = Tasks.TaskID
           WHERE      Tasks.TaskTypeID = TaskSteps.TaskTypeID
           AND        Tasks.TaskID = TaskSteps.TaskID
           AND        IsValid = 1
           AND        ProcessStatusID = 2
           AND        TaskSteps.Filename = @FileName
         )
    BEGIN              
        INSERT  INTO TaskSteps ( TaskID, StepDesc )
        VALUES  (
                  @TaskID,
                  'Duplicate filename. (' + @Filename + ') Already exists.' 
                )                
        SET @FileAlreadyExists = 1                  
    END        
END
于 2012-06-26T10:33:46.817 に答える
1

これを試して

文字インデックス関数を使用する

IF EXISTS (SELECT TOP 30 Filename
           FROM  TaskSteps  INNER JOIN Tasks ON TaskSteps.TaskID = Tasks.TaskID
           WHERE (SUBSTRING(TaskSteps.Filename,CHARINDEX('_',TaskSteps.Filename),13) =    
                  SUBSTRING(@Filename,CHARINDEX('_',@Filename),13) ) 
                 AND IsValid = 1                            
                 AND ProcessStatusID = 2)
于 2012-06-26T10:35:01.993 に答える