在我部署一个 .dtsx SSIS 包之后,我可以运行任何查询或 C# 代码来让它在驱动器上洗澡,或者我可以检索部署的 .dtsx 文件。
3 回答
由于包存储在SSIS包中,MSDB
所以Right Click
放在SQL Server中然后单击Run Package
。你会得到一个对话框
单击Connection Managers
选项卡,然后更改单个连接的连接字符串。
别的
如果 SSIS 包是使用创建的,xml config file
则单击configuration tab
并打开配置文件以了解包的详细信息
更新1:-
- 为 SSIS 包变量赋值
添加此命名空间 Microsoft.SqlServer.Dts.Runtime;
Application app = new Application();
Package package = null;
package = app.LoadPackage(deployed ssis package path,null) //Load DTSX path
//Access the SSIS variables
pkg.Connections["sConn"].ConnectionString = strSourceConn;
pkg.Connection["dConn"].ConnectionString = strDestConn;
2.阅读XML
每个 dtsx 包的底层代码都是xml
.因此您可以使用 C# 加载 XML,然后遍历每个节点并查找信息。
3.从dtsx.config文件中获取信息。
正如我上面所说的,ssis 包可能有一个 xml 配置文件,它存储所有信息。这个 xml 文件在 C# 中更容易阅读,然后阅读中提到的整个 DTSX 包point 2
4.如果包配置存储在sql server中,则使用以下代码。代码取自收集SSIS包信息
SELECT Props.Prop.query('.') as PropXml,
Props.Prop.value('declare namespace p1="www.microsoft.com/SqlServer/Dts";
string(./@p1:Name)','nvarchar(max)') as PropName,
Props.Prop.value('.', 'nvarchar(max)') as PropValue
FROM (
SELECT CAST(pkgblob.BulkColumn AS XML) pkgXML
FROM OPENROWSET(bulk 'C:\tmp\MyPkg.dtsx',single_blob) AS pkgblob
) t
CROSS APPLY pkgXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";
/DTS:Executable/DTS:Property') Props(Prop)
结论 :-
如果 SSIS 包是使用配置文件创建的。找到它的存储位置。如果它存储在XML configuration type
C# 中,则加载该 XML 文件并搜索节点。如果存储了 ssis 数据,sql server
则运行上面的 sql 并获取所有信息。sql 查询以 xml 类型返回包详细信息,您可以在 C# 中读取这些详细信息并获取所需信息
更新 2:-
如果 SSIS 包部署在 sql server 中,那么下面的代码将帮助您使用 C# 检索包详细信息
public class SSISDetails
{
public string PackageData { get; set; }
public string PackageName { get; set; }
}
string storedProc = string.Empty;
List<SSISDetails> _pkgcol = new List<SSISDetails>();
string connectionString = "server=localhost;Integrated Security=SSPI";
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("SSISDetails", conn)
{
CommandType = CommandType.StoredProcedure
})
{
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read ())
{
_pkgcol.Add(new SSISDetails()
{
//Please don't write the code like the one below accessing
//columns using index .
PackageName =reader[2].ToString (),
PackageData =reader[10].ToString ()
});
}
conn.Close();
}
foreach (var item in _pkgcol.Where (a=>a.PackageName =="YourPackageName") )
{
//read the item.PackageData and using Linq to xml retrieve the nodes which
//you want
}
检索信息的存储过程是:- 下面的 sql 代码给出了package name
、path
和格式description
package data
xml
Create Procedure SSISDetails
as
begin
with ChildFolders
as
(
select PARENT.parentfolderid, PARENT.folderid, PARENT.foldername,
cast('' as sysname) as RootFolder,
cast(PARENT.foldername as varchar(max)) as FullPath,
0 as Lvl
from msdb.dbo.sysssispackagefolders PARENT
where PARENT.parentfolderid is null
UNION ALL
select CHILD.parentfolderid, CHILD.folderid, CHILD.foldername,
case ChildFolders.Lvl
when 0 then CHILD.foldername
else ChildFolders.RootFolder
end as RootFolder,
cast(ChildFolders.FullPath + '/' + CHILD.foldername as varchar(max))
as FullPath,
ChildFolders.Lvl + 1 as Lvl
from msdb.dbo.sysssispackagefolders CHILD
inner join ChildFolders on ChildFolders.folderid = CHILD.parentfolderid
)
select F.RootFolder, F.FullPath, P.name as PackageName,
P.description as PackageDescription, P.packageformat, P.packagetype,
P.vermajor, P.verminor, P.verbuild, P.vercomments,
cast(cast(P.packagedata as varbinary(max)) as xml) as PackageData
from ChildFolders F
inner join msdb.dbo.sysssispackages P on P.folderid = F.folderid
order by F.FullPath asc, P.name asc;
end
如果部署到文件系统,默认包位置是:C:\Program Files\Microsoft SQL Server\100\DTS\Packages (SQL 2008) 或 C:\Program Files\Microsoft SQL Server\90\DTS\Packages (SQL 2005 )。
如果部署到 sql server,它存储在 msdb 数据库中,因此您可以从 SQL Server Management Studio 访问它。
- 在连接选项中选择“集成服务”而不是“数据库引擎”。
- Expand Stored Packages - 展开 MSDB 并搜索您的包(与您在保存包时使用的名称相同。)
您可以通过 Visual Studio(或 Business Intelligence Development Studio)导入它。创建一个新的 SSIS 项目,右键单击包,选择导入并连接到存储包的 SQL Server。