1

SQL Server 2008 R2でマルチステップSSISパッケージを作成しました。これは、Integration ServiceのDTSパッケージで起動すると正常に実行されますが、SharePointフォルダーにExcelファイルをコピーするステップでSQLServerエージェントジョブで呼び出されると失敗します。サーバー上に作成されます。パッケージ内では、Run64bitRuntimeがFalseに設定されており、ジョブのステップでパッケージが呼び出されると、[実行]オプションで[32ビットランタイムを使用する]がオンになります。これは、他のSharePointフォルダーにあるExcelファイルから情報を読み取っている他のSSISパッケージで機能します。ここでユニークなのは、サーバー上に作成されたExcelファイルをSharePointフォルダーにコピーしようとしていることです。Excelファイルの一意のフォーマットと内容がなければ、代わりにSSRSを使用します。

SQLServerエージェントジョブの[履歴の表示]を選択すると返されるエラーメッセージは次のとおりです。

日付2013年1月29日15:13:47ログジョブ履歴(データプル)

ステップID1サーバーxxxx-xxx-xxジョブ名データプルステップ名実行xxxx_Extractxxx期間00:16:13SQL重大度0SQLメッセージID0オペレーターEメールオペレーターネット送信オペレーターページ再試行試行0

メッセージ

ユーザーとして実行:CABLE!svcnvdeautomation。Microsoft(R)SQL Server Execute Package Utilityバージョン10.50.1600.1(32ビット用)Copyright(C)Microsoft Corporation 2010.無断複写・転載を禁じます。
開始:3:13:47 PMエラー:2013-01-29 15:30:00.01コード:0x00000001ソース:Excelファイルの作成説明:System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。---> System.Runtime.InteropServices.COMException(0x800A03EC):HRESULTからの例外:Microsoft.Office.Interop.Excel.WorkbookClass.SaveAs(Object Filename、Object FileFormat、Object Password、Object WriteResPassword、Object ReadOnlyRecommended、Object CreateBackup 、XlSaveAsAccessMode AccessMode、Object ConflictResolution、Object AddToMru、Object TextCodepage、Object TextVisualLayout、Object Local)at ST_87e8d62a054b4e16b60297154afc19d8.csproj.ScriptMain.Main()---内部例外スタックトレースの終了--- System.RuntimeMethodHandle._InvokeMethod 、
System.RuntimeType.InvokeMember(String name、BindingFlags bindingFlags、バインダーバインダー、オブジェクトターゲット、Object [] ProvidedArgs、ParameterModifier []修飾子、CultureInfoカルチャー、String [] namedParams)at System.Type.InvokeMember(String name、BindingFlags invokeAttr、 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()のバインダーバインダー、オブジェクトターゲット、Object []引数、CultureInfoカルチャー)終了エラーDTExec:パッケージの実行でDTSER_FAILURE(1)が返されました。開始:3:13:47 PM終了:3:30:00 PM経過:972.573秒。パッケージの実行に失敗しました。ステップは失敗しました。

それが役立つ場合は、Excelファイルをコピーするために適用されているコードを以下に示します。

public void Main()
{

    SharePointListsService.Lists listService = new SharePointListsService.Lists();
    listService.Credentials = System.Net.CredentialCache.DefaultCredentials;

    // Create variable with format of "2012-11-28"
    string DateTimeNow = DateTime.Now.ToString("yyyy") + "-" + DateTime.Now.ToString("MM") + "-" + DateTime.Now.ToString("dd");

    // Check out the file as defined in SharePoint.
    string fileCheckout = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
    bool myResults = listService.CheckOutFile(fileCheckout, "true", DateTime.Now.ToString("f"));


    // Full file name including path and extension
    // "D:\Work area\Reports\Project.xls"
    string FullFileName = Dts.Variables["User::ReportsExcelFileName"].Value.ToString();

    // File Name without path and extension
    // "Project"
    string FileName = GetFileNameWithoutExtFromPath(FullFileName);

    // Path only
    // "D:\Work area\Reports\"
    string Path = GetDirFromPath(FullFileName);

    // From the source file (FullFileName) assemble the [Path] and [Filename] of new file copy that includes a specific date format attached to new file name.
    // "D:\Work area\Reports\Project 2012-11-28.xls"
    File.Copy(FullFileName, (Path + "\\" + FileName + " " + DateTimeNow + ".xls"), true);

    // Get UNC Folder path
    // "\\xx.yy.com\Shared Documents\Data Pulls"        string UNCFolder = Dts.Variables["UNCFolder"].Value.ToString();

    // Get File name as it appears in the Reports folder
    string ReportsExcelFile = FullFileName;

    // Copy the Excel file from the Reports directory to the SharePoint UNC folder location
    File.Copy(ReportsExcelFile, (UNCFolder + "\\" + FileName + ".xls"), true);



    //Check in
    //string fileCheckin = Dts.Variables["User::URLFolder"].Value.ToString();
    string fileCheckin = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
    myResults = listService.CheckInFile(fileCheckin, "Completed revision.", "0");

    Dts.TaskResult = (int)ScriptResults.Success;
}

       public String GetFileNameWithoutExtFromPath(String path)
        {
            try
            {
                String filename = path.Substring(path.LastIndexOf("\\") + 1);
                int pos = filename.LastIndexOf(".");

                if (pos != -1)
                    return filename.Substring(0, pos);
                else
                    return filename;
            }

            catch (Exception)
            {
                // error  
                return "";
            }
        }


        public String GetDirFromPath(String path)
        {
            try
            {
                return path.Substring(0, path.LastIndexOf("\\") + 1);
            }
            catch (Exception)
            {
                // error
                return "";
            }
        }

SQL Server Configuration Managerで、ネットワークアクセスを使用してログオンを適用するようにSQL Serverエージェントを設定しました。これは、他のジョブによって呼び出されている他のSSISパッケージによって正常に適用されています。また、サーバーの[コンポーネントサービス]で、[マイコンピューター]に移動し、右クリックしてプロパティを選択すると、6つのタブがある[マイコンピューターのプロパティ]ボックスが開きます。[COMセキュリティ]タブを選択し、アクセス許可と起動およびアクティブ化許可の両方の編集制限を編集しました。それぞれの下にネットワークサービスを追加しました。アクセス許可については[ローカルアクセスを許可する]をオンにし、起動とアクティブ化のアクセス許可については[ローカル起動とローカルアクティベーション]を選択しました。

上記の詳細を踏まえて、SQL Serverエージェントで実行したときにExcelファイルをコピーするステップでSSISパッケージが失敗し続ける理由を誰かが判断するのを手伝ってもらえますか?

4

2 に答える 2

1

SQLジョブがでSSISパッケージを実行していると仮定します。このパッケージにSQL Server Agent Service Accountは、あるフォルダーの場所から別のフォルダーの場所にファイルをコピー/移動するための適切な権限がない可能性があります。ドメインアカウント(できれば)の資格情報を使用するプロキシアカウントを設定する必要があります。ドメインアカウントには、フォルダ間でファイルをコピー/移動するための適切なレベルの権限が必要です。

以下のSOの質問に答えると、プロキシアカウントを構成する方法が段階的に説明されます。また、プロキシアカウントを使用してSQLジョブ内でSSISパッケージを実行する方法についても説明します。

SSISパッケージを実行するステップをSQLServerエージェントジョブに作成するにはどうすればよいですか?

少なくとも、これは、フォルダ間でファイルを移動する際に同様の問題が発生したときに行ったことです。

それがあなたの問題の解決策を見つけるためのガイドになることを願っています。

于 2013-01-29T23:08:44.053 に答える
-1

フォルダの追加C:\Windows\SysWOW64\config\systemprofile\Desktopは私のために働いた。

于 2013-10-06T12:28:45.993 に答える