我正在使用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
感谢任何帮助,
由于
答案 0 :(得分:1)
如果我正确理解您的问题,您需要给定经理和员工单位组合的工作名称列表。如果是这种情况,则需要一个存储过程,该过程可以以逗号分隔值的形式给出作业名称列表。
在我看来,两个查找转换任务似乎是一种过度杀伤。
根据问题中提供的数据,创建和填充表格部分提供了示例数据。
创建以下存储过程dbo.GetManagerJobProfiles
,它将Manager_Name
和Emp_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 中的示例数据。
屏幕截图#2显示了两组不同参数的存储过程输出。
如果我必须在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组件,相应地匹配搜索列并返回相应的值。
但是,由于您希望返回多个值,因此LookUp组件只返回第一个匹配值,因此不会为您提供选项。
要在每个起始行中获得多个结果,您必须使用两个源控件(一个用于主表,另一个用于查找表)以及Merge Join控件
合并连接控件将使您能够组合两组数据,但是当存在多个匹配时,您将获得多行。因此,在您的示例中,AAA和Sales作为输入将提供两行;
然后,您可以将此数据传递到目标表。
对于第二个问题,查询并期望在SQL Server中使用逗号分隔值进行综合响应是不常见的。
如果你能够利用多个搜索和结果行的数据(即首先搜索行id 27然后搜索id为29的行),那么使用查找任务就足够了。
否则,可能会进行第二次传递(新数据流任务)并使用第一次传递临时表将数据(使用脚本?)合并为所需的csv格式。