Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
SSIS Integration Runtime i Azure Data Factory
Om du vill köra fjärrpaket från en lokal dator som inte har Integration Services installerat startar du paketen så att de körs på fjärrdatorn där Integration Services är installerat. För att uppnå det här målet måste den lokala datorn använda SQL Server Agent, en webbtjänst eller en fjärrkomponent för att starta paketen på fjärrdatorn. Om du försöker starta fjärrpaketen direkt från den lokala datorn läses paketen in på och försöker köra från den lokala datorn. Om den lokala datorn inte har Integration Services installerat körs inte paketen.
Anmärkning
Du kan inte köra paket utanför SQL Server Data Tools på en klientdator om inte Integration Services har installerats. Villkoren för SQL Server-licensiering kanske inte låter dig installera Integration Services på andra datorer. Integration Services är en serverkomponent och kan inte omdistribueras till klientdatorer.
Du kan också köra ett fjärrpaket från en lokal dator som har Integration Services installerat. Mer information finns i Läsa in och köra ett lokalt paket programmatiskt.
Köra ett fjärrpaket på fjärrdatorn
Det finns flera sätt att köra ett fjärrpaket på en fjärrserver:
Använda SQL Server-agenten för att köra fjärrpaketet programmatiskt
Använda en webbtjänst eller fjärrkomponent för att köra fjärrpaketet programmatiskt
Nästan alla metoder som används i det här avsnittet för att läsa in och spara paket kräver en referens till sammansättningen Microsoft.SqlServer.ManagedDTS . Undantaget är den ADO.NET metod som visas i det här avsnittet för att köra den sp_start_job lagrade proceduren, som endast kräver referenser till System.Data och Microsoft.Data.SqlClient. När du har lagt till referensen till sammansättningen Microsoft.SqlServer.ManagedDTS i ett nytt projekt importerar du namnområdet med instruktionen Microsoft.SqlServer.Dts.Runtimeusing eller Imports .
Använda SQL Server-agenten för att köra ett fjärrpaket programmatiskt på servern
Följande kodexempel visar hur du programmatiskt använder SQL Server Agent för att köra ett fjärrpaket på servern. Kodexemplet anropar den systemlagrade proceduren , sp_start_job, som startar ett SQL Server Agent-jobb. Jobbet som proceduren startar heter RunSSISPackage, och det här jobbet finns på fjärrdatorn. Jobbet RunSSISPackage kör sedan paketet på fjärrdatorn.
Anmärkning
Returvärdet för den sp_start_job lagrade proceduren anger om den lagrade proceduren kunde starta SQL Server Agent-jobbet. Returvärdet anger inte om paketet lyckades eller misslyckades.
Information om hur du felsöker paket som körs från SQL Server Agent-jobb finns i Microsoft-artikeln , Ett SSIS-paket körs inte när du anropar SSIS-paketet från ett SQL Server Agent-jobbsteg.
Exempelkod
Imports System.Data
Imports Microsoft.Data.SqlClient
Module Module1
Sub Main()
Dim jobConnection As SqlConnection
Dim jobCommand As SqlCommand
Dim jobReturnValue As SqlParameter
Dim jobParameter As SqlParameter
Dim jobResult As Integer
jobConnection = New SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI")
jobCommand = New SqlCommand("sp_start_job", jobConnection)
jobCommand.CommandType = CommandType.StoredProcedure
jobReturnValue = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
jobReturnValue.Direction = ParameterDirection.ReturnValue
jobCommand.Parameters.Add(jobReturnValue)
jobParameter = New SqlParameter("@job_name", SqlDbType.VarChar)
jobParameter.Direction = ParameterDirection.Input
jobCommand.Parameters.Add(jobParameter)
jobParameter.Value = "RunSSISPackage"
jobConnection.Open()
jobCommand.ExecuteNonQuery()
jobResult = DirectCast(jobCommand.Parameters("@RETURN_VALUE").Value, Integer)
jobConnection.Close()
Select Case jobResult
Case 0
Console.WriteLine("SQL Server Agent job, RunSSISPackage, started successfully.")
Case Else
Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.")
End Select
Console.Read()
End Sub
End Module
using System;
using System.Data;
using Microsoft.Data.SqlClient;
namespace LaunchSSISPackageAgent_CS
{
class Program
{
static void Main(string[] args)
{
SqlConnection jobConnection;
SqlCommand jobCommand;
SqlParameter jobReturnValue;
SqlParameter jobParameter;
int jobResult;
jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI");
jobCommand = new SqlCommand("sp_start_job", jobConnection);
jobCommand.CommandType = CommandType.StoredProcedure;
jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
jobReturnValue.Direction = ParameterDirection.ReturnValue;
jobCommand.Parameters.Add(jobReturnValue);
jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar);
jobParameter.Direction = ParameterDirection.Input;
jobCommand.Parameters.Add(jobParameter);
jobParameter.Value = "RunSSISPackage";
jobConnection.Open();
jobCommand.ExecuteNonQuery();
jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value;
jobConnection.Close();
switch (jobResult)
{
case 0:
Console.WriteLine("SQL Server Agent job, RunSSISPackage, started successfully.");
break;
default:
Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.");
break;
}
Console.Read();
}
}
}
Använda en webbtjänst eller fjärrkomponent för att köra ett fjärrpaket programmatiskt
Den tidigare lösningen för att köra paket programmatiskt på servern kräver ingen anpassad kod på servern. Men du kanske föredrar en lösning som inte förlitar sig på SQL Server Agent för att köra paket. I följande exempel visas hur du skapar en webbtjänst på servern för att starta Integration Services-paket lokalt och ett testprogram för att anropa webbtjänsten från en klientdator. Om du föredrar att skapa en fjärrkomponent i stället för en webbtjänst kan du använda samma kodlogik med få ändringar i en fjärrkomponent. En fjärrkomponent kan dock kräva mer omfattande konfiguration än en webbtjänst.
Viktigt!
Med standardinställningarna för autentisering och auktorisering har en webbtjänst vanligtvis inte tillräcklig behörighet för att komma åt SQL Server eller filsystemet för att läsa in och köra paket. Du kan behöva tilldela lämpliga behörigheter till webbtjänsten genom att konfigurera dess autentiserings- och auktoriseringsinställningar i web.config-filen och tilldela databas- och filsystembehörigheter efter behov. En fullständig diskussion om behörigheter för webb-, databas- och filsystem ligger utanför omfånget för det här avsnittet.
Viktigt!
Metoderna för Application klassen för att arbeta med SSIS Package Store stöder endast ".", localhost eller servernamnet för den lokala servern. Du kan inte använda "(local)".
Exempelkod
Följande kodexempel visar hur du skapar och testar webbtjänsten.
Skapa webbtjänsten
Du kan läsa in ett Integration Services-paket direkt från en fil, från SQL Server eller från SSIS Package Store. SSIS Package Store hanterar paketlagring i både SQL Server och särskilda filsystemmappar. Det här exemplet stöder alla tillgängliga alternativ genom att använda en Select Case - eller switch-konstruktion för att välja lämplig syntax för att starta paketet och sammanfoga indataargumenten på rätt sätt. Metoden LaunchPackage-webbtjänst returnerar resultatet av paketkörningen som ett heltal i stället för ett DTSExecResult värde så att klientdatorer inte behöver någon referens till integrationstjänsters sammansättningar.
Så här skapar du en webbtjänst för att köra paket på servern programmatiskt
Öppna Visual Studio och skapa ett webbtjänstprojekt på önskat programmeringsspråk. Exempelkoden använder namnet LaunchSSISPackageService för projektet.
Lägg till en referens till Microsoft.SqlServer.ManagedDTS och lägg till en import - eller användningssats i kodfilen för namnområdet Microsoft.SqlServer.Dts.Runtime .
Klistra in exempelkoden för webbtjänstmetoden LaunchPackage i klassen . (Exemplet visar hela innehållet i kodfönstret.)
Skapa och testa webbtjänsten genom att ange en uppsättning giltiga värden för indataargumenten för metoden LaunchPackage som pekar på ett befintligt paket. Om package1.dtsx till exempel lagras på servern i C:\My Packages skickar du "file" som värdet för sourceType, "C:\My Packages" som värdet för sourceLocation och "package1" (utan tillägget) som värdet för packageName.
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO
<WebService(Namespace:="https://dtsue/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class LaunchSSISPackageService
Inherits System.Web.Services.WebService
' LaunchPackage Method Parameters:
' 1. sourceType: file, sql, dts
' 2. sourceLocation: file system folder, (none), logical folder
' 3. packageName: for file system, ".dtsx" extension is appended
<WebMethod()> _
Public Function LaunchPackage( _
ByVal sourceType As String, _
ByVal sourceLocation As String, _
ByVal packageName As String) As Integer 'DTSExecResult
Dim packagePath As String
Dim myPackage As Package
Dim integrationServices As New Application
' Combine path and file name.
packagePath = Path.Combine(sourceLocation, packageName)
Select Case sourceType
Case "file"
' Package is stored as a file.
' Add extension if not present.
If String.IsNullOrEmpty(Path.GetExtension(packagePath)) Then
packagePath = String.Concat(packagePath, ".dtsx")
End If
If File.Exists(packagePath) Then
myPackage = integrationServices.LoadPackage(packagePath, Nothing)
Else
Throw New ApplicationException( _
"Invalid file location: " & packagePath)
End If
Case "sql"
' Package is stored in MSDB.
' Combine logical path and package name.
If integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty) Then
myPackage = integrationServices.LoadFromSqlServer( _
packageName, "(local)", String.Empty, String.Empty, Nothing)
Else
Throw New ApplicationException( _
"Invalid package name or location: " & packagePath)
End If
Case "dts"
' Package is managed by SSIS Package Store.
' Default logical paths are File System and MSDB.
If integrationServices.ExistsOnDtsServer(packagePath, ".") Then
myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", Nothing)
Else
Throw New ApplicationException( _
"Invalid package name or location: " & packagePath)
End If
Case Else
Throw New ApplicationException( _
"Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.")
End Select
Return myPackage.Execute()
End Function
End Class
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;
[WebService(Namespace = "https://dtsue/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class LaunchSSISPackageServiceCS : System.Web.Services.WebService
{
public LaunchSSISPackageServiceCS()
{
}
// LaunchPackage Method Parameters:
// 1. sourceType: file, sql, dts
// 2. sourceLocation: file system folder, (none), logical folder
// 3. packageName: for file system, ".dtsx" extension is appended
[WebMethod]
public int LaunchPackage(string sourceType, string sourceLocation, string packageName)
{
string packagePath;
Package myPackage;
Application integrationServices = new Application();
// Combine path and file name.
packagePath = Path.Combine(sourceLocation, packageName);
switch(sourceType)
{
case "file":
// Package is stored as a file.
// Add extension if not present.
if (String.IsNullOrEmpty(Path.GetExtension(packagePath)))
{
packagePath = String.Concat(packagePath, ".dtsx");
}
if (File.Exists(packagePath))
{
myPackage = integrationServices.LoadPackage(packagePath, null);
}
else
{
throw new ApplicationException("Invalid file location: "+packagePath);
}
break;
case "sql":
// Package is stored in MSDB.
// Combine logical path and package name.
if (integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty))
{
myPackage = integrationServices.LoadFromSqlServer(packageName, "(local)", String.Empty, String.Empty, null);
}
else
{
throw new ApplicationException("Invalid package name or location: "+packagePath);
}
break;
case "dts":
// Package is managed by SSIS Package Store.
// Default logical paths are File System and MSDB.
if (integrationServices.ExistsOnDtsServer(packagePath, "."))
{
myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", null);
}
else
{
throw new ApplicationException("Invalid package name or location: "+packagePath);
}
break;
default:
throw new ApplicationException("Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.");
}
return (Int32)myPackage.Execute();
}
}
Testa webbtjänsten
Följande exempelkonsolprogram använder webbtjänsten för att köra ett paket. Metoden LaunchPackage för webbtjänsten returnerar resultatet av paketkörningen som ett heltal i stället för ett DTSExecResult värde så att klientdatorer inte behöver någon referens till integrationstjänsters sammansättningar. Exemplet skapar en privat uppräkning vars värden speglar DTSExecResult värdena för att rapportera resultatet av körningen.
Så här skapar du ett konsolprogram för att testa webbtjänsten
I Visual Studio lägger du till ett nytt konsolprogram, med det programmeringsspråk du föredrar, till samma lösning som innehåller webbtjänstprojektet. Exempelkoden använder namnet LaunchSSISPackageTest för projektet.
Ange det nya konsolprogrammet som startprojekt i lösningen.
Lägg till en webbreferens för webbtjänstprojektet. Om det behövs justerar du variabeldeklarationen i exempelkoden för det namn som du tilldelar webbtjänstproxyobjektet.
Klistra in exempelkoden för Main-rutinen och den privata uppräkningen i koden. (Exemplet visar hela innehållet i kodfönstret.)
Redigera den kodrad som anropar metoden LaunchPackage för att ange en uppsättning giltiga värden för de indataargument som pekar på ett befintligt paket. Om package1.dtsx till exempel lagras på servern i C:\Mina paket skickar du "file" som värdet
sourceType, "C:\My Packages" som värdetsourceLocationför , och "package1" (utan tillägget) som värdet förpackageName.
Module LaunchSSISPackageTest
Sub Main()
Dim launchPackageService As New LaunchSSISPackageService.LaunchSSISPackageService
Dim packageResult As Integer
Try
packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage")
Catch ex As Exception
' The type of exception returned by a Web service is:
' System.Web.Services.Protocols.SoapException
Console.WriteLine("The following exception occurred: " & ex.Message)
End Try
Console.WriteLine(CType(packageResult, PackageExecutionResult).ToString)
Console.ReadKey()
End Sub
Private Enum PackageExecutionResult
PackageSucceeded
PackageFailed
PackageCompleted
PackageWasCancelled
End Enum
End Module
using System;
namespace LaunchSSISPackageSvcTestCS
{
class Program
{
static void Main(string[] args)
{
LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS launchPackageService = new LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS();
int packageResult = 0;
try
{
packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage");
}
catch (Exception ex)
{
// The type of exception returned by a Web service is:
// System.Web.Services.Protocols.SoapException
Console.WriteLine("The following exception occurred: " + ex.Message);
}
Console.WriteLine(((PackageExecutionResult)packageResult).ToString());
Console.ReadKey();
}
private enum PackageExecutionResult
{
PackageSucceeded,
PackageFailed,
PackageCompleted,
PackageWasCancelled
};
}
}
Externa resurser
- Video, Gör så här: Automatisera SSIS-paketkörning med SQL Server-agenten (SQL Server Video) på technet.microsoft.com
Relaterat innehåll
Förstå skillnaderna mellan lokal körning och fjärrkörning
Läser in och kör ett lokalt paket programmatiskt
Läser in utdata från ett lokalt paket