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パッケージが失敗し続ける理由を誰かが判断するのを手伝ってもらえますか?