是否可以通过脚本任务或变量在SSIS中找出项目名称?
我知道如何获取PackageName和TaskName,但在这种情况下,我需要ProjectName。
答案 0 :(得分:2)
不可否认,这是一套神奇的房子,但它在通过SSDT运行时起作用......你需要一些东西让这个脚本任务工作:
1.要访问的变量,以便您可以爬到其父级
2.对Microsoft.SqlServer.DTSRuntimeWrap的引用
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using RuntimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
RuntimeWrapper.IDTSProject100 p = ((RuntimeWrapper.IDTSProject100)((Package)Dts.Variables["User::myVar"].Parent).Project);
string projectName = GetProjectName(p);
Dts.TaskResult = (int)ScriptResults.Success;
}
private string GetProjectName(RuntimeWrapper.IDTSProject100 proj)
{
System.Reflection.PropertyInfo pInfo = proj.GetType().GetProperty("Project",
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
Project p = (Project)pInfo.GetValue(proj, null);
return p.Name;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
答案 1 :(得分:1)
这是我之前尝试过的一种可能的解决方案。
只需将System::VersionGUID
映射到@Version
,将System::PackageID
映射到@Package
,如下面的查询。
DECLARE @Package uniqueidentifier = ?
DECLARE @Version uniqueidentifier = ?
DECLARE @ProjectName nvarchar(100) = (
SELECT proj.name
FROM [catalog].[packages] pkg
INNER JOIN catalog.projects proj ON pkg.project_id = proj.project_id
WHERE package_guid= @Package
AND version_guid = @Version
)
SELECT ISNULL(@ProjectName, 'running from ssdt') as ProjectName;
如果项目部署在SSIS目录中并且不从SSDT运行,您将获得项目名称,否则它将使用您可以放置任何内容的ISNULL
函数返回null。我希望这可以帮到你。
编辑: version_guid
澄清
如果项目已部署在多个文件夹中,version_guid
将会有所不同。
查找文档msdn网站关于version_guid
属性非常简短。
获取首次创建包时生成的版本GUID。 该字段是只读的。
在SSISDB中创建包的过程将是在部署时,每个项目部署的version_guid应该是不同的。
我没有深入测试,但我重新创建了这个场景:在两个不同的文件夹中部署相同的项目。
注意package_guid和version_guid列。