SSIS查表表问题

时间:2011-08-17 14:16:37

标签: sql-server-2008 ssis lookup

我正在使用SSIS(SQL Server 2008)从表中查找值。我想知道以下是否可能:

问题1

查找表1

Manager_Name    EMP_UNIT    Job_Profile_ID
AAA             SALES       27
BBB             HR          28
AAA             SALES       29

我必须在Lookup表中传递'Manager_Name'和'EMP_UNIT'值并获取 以逗号分隔格式的作业配置文件ID。 就像我将传递值'AAA'和'SALES',我希望返回值为27,29 我该怎么做?

问题2

查找表2

Job_Profile_ID  Job_Name
27              Jr. Salesman
28              Sales Manager
29              Sr. Salesman

我必须以逗号分隔格式(27,29)传递作业配置文件ID值 我想要逗号分隔格式的返回值(Jr. Salesman,Sr。Salesman)。 这在SSIS中是否可行?

环境详情: Windows 2008服务器上的MS SQL Server集成服务(出价)2008

感谢任何帮助,

由于

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要给定经理和员工单位组合的工作名称列表。如果是这种情况,则需要一个存储过程,该过程可以以逗号分隔值的形式给出作业名称列表。

在我看来,两个查找转换任务似乎是一种过度杀伤。

根据问题中提供的数据,创建和填充表格部分提供了示例数据。

创建以下存储过程dbo.GetManagerJobProfiles,它将Manager_NameEmp_Unit作为输入参数,并以逗号分隔列表的形式返回给定参数的匹配作业名称列表。此存储过程使用FOR XML子句生成逗号分隔值。由于逗号在开头附加,我们必须从列表中截断第一个逗号。因此,子字符串函数用于完成该工作以提供更清晰的输出。

CREATE PROCEDURE dbo.GetManagerJobProfiles
(
        @Manager_Name   NVARCHAR(80)
    ,   @Emp_Unit       NVARCHAR(80)
)
AS
BEGIN   
    SET NOCOUNT ON;

    SELECT SUBSTRING(
            (
                SELECT          ', ' + J.Job_Name
                FROM            dbo.Managers        M
                LEFT OUTER JOIN dbo.Jobs            J
                ON              M.Job_Profile_Id    = J.Job_Profile_Id
                WHERE           M.Manager_Name      = @Manager_Name
                AND             M.Emp_Unit          = @Emp_Unit
                FOR XML PATH ('')
            )
        , 3, 1000) AS Job_Name
END
GO

屏幕截图#1显示表 dbo.Managers dbo.Jobs 中的示例数据。

Table data

屏幕截图#2显示了两组不同参数的存储过程输出。

Stored procedure output

如果我必须在SSIS包中使用它,我将使用执行SQL任务获取不同的Manager_Name和Emp_Unit组合的列表,并将结果集填充到数据类型为Object的SSIS包变量中。

然后,我将使用Foreach loop container使用Foreach ADO enumerator循环访问对象变量。在Foreach循环容器中,我将放置一个Data Flow Task。在数据流任务中,我将放置一个OLE DB Source,它将使用存储过程作为源。对于循环访问的每个Manager_Name和Emp_Unit组合,值将作为参数传递给OLE DB源以获取作业名称值。

希望有所帮助。

创建和填充表格此结构基于问题中提供的数据。

CREATE TABLE [dbo].[Jobs](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Job_Profile_Id] [int] NOT NULL,
    [Job_Name] [nvarchar](40) NOT NULL,
CONSTRAINT [PK_Jobs] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Managers](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Manager_Name] [nvarchar](80) NOT NULL,
    [Emp_Unit] [nvarchar](80) NOT NULL,
    [Job_Profile_Id] [int] NOT NULL,
CONSTRAINT [PK_Managers] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

INSERT INTO dbo.Managers (Manager_Name, Emp_Unit, Job_Profile_Id) VALUES
    ('AAA', 'SALES', 27),
    ('BBB', 'HR', 28),
    ('AAA', 'SALES', 29);

INSERT INTO dbo.Jobs(Job_Profile_Id, Job_Name) VALUES
    (27, 'Jr. Salesman'),
    (28, 'Sales Manager'),
    (29, 'Sr. Salesman');

答案 1 :(得分:0)

我可以帮助你解决问题1,但我不确定你的第二个问题。

要查找单个列,您通常会使用LookUp组件,相应地匹配搜索列并返回相应的值。

SSIS LookUp component

但是,由于您希望返回多个值,因此LookUp组件只返回第一个匹配值,因此不会为您提供选项。

要在每个起始行中获得多个结果,您必须使用两个源控件(一个用于主表,另一个用于查找表)以及Merge Join控件

SSIS Merge Join control

合并连接控件将使您能够组合两组数据,但是当存在多个匹配时,您将获得多行。因此,在您的示例中,AAA和Sales作为输入将提供两行;

  • AAA,Sales,27
  • AAA,Sales,29

然后,您可以将此数据传递到目标表。

对于第二个问题,查询并期望在SQL Server中使用逗号分隔值进行综合响应是不常见的。

如果你能够利用多个搜索和结果行的数据(即首先搜索行id 27然后搜索id为29的行),那么使用查找任务就足够了。

否则,可能会进行第二次传递(新数据流任务)并使用第一次传递临时表将数据(使用脚本?)合并为所需的csv格式。