2011-08-17 71 views
0

我正在使用SSIS(SQL Server 2008)從表中查找值。我想知道,如果以下是可能的:SSIS查找表問題

問題1

查找表1

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

我必須通過在查找表中的「MANAGER_NAME」和'EMP_UNIT的價值,並獲取 作業配置文件ID以逗號分隔的格式顯示。 就像我會通過價值'AAA'和'銷售',我想返回值爲27,29 我該怎麼做?

問題2

查找表2

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

我必須通過在逗號作業資料ID值分隔的格式(27,29)和 我想在逗號返回值分隔的格式( Jr. Salesman,高級銷售員)。 這可能在SSIS中嗎?

環境的詳細信息: MS SQL Server集成服務(出價)2008在Windows 2008 Server

任何幫助表示讚賞,

感謝

回答

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.Managersdbo.Jobs在採樣數據。

Table data

截圖#2示出了用於兩個不同的參數集的存儲過程輸出。

Stored procedure output

如果我有一個SSIS包使用此,我將使用執行SQL任務獲得不同MANAGER_NAME和Emp_Unit組合列表,將填充結果集爲數據類型對象的SSIS包變量。

然後,我將使用Foreach loop containerForeach ADO enumerator來循環顯示對象變量。在Foreach循環容器中,我將放置一個Data Flow Task。在數據流任務中,我將放置一個將使用存儲過程作爲源的OLE DB Source。對於循環遍歷的每個Manager_Name和Emp_Unit組合,這些值將作爲參數傳遞給OLE DB Source以獲取作業名稱值。

希望有所幫助。

創建和填充表格此結構基於問題中提供的數據。

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'); 
0

我可以幫你的問題1,但我我不確定你的第二個問題。

要查找單個列,通常會使用LookUp組件,相應地匹配搜索列並返回相應的值。

SSIS LookUp component

然而,正如您所期待返回多個值,這不會是你作爲查找組件將只返回第一個匹配值的選項。

達到每起始行多個結果,你將不得不使用兩個源控件(一個主表和其它對查找表)與合併一起加入控制

SSIS Merge Join control

合併連接控制將使您能夠組合兩組數據,但是當存在多個匹配時,您將獲得多行。所以在你的例子中,AAA和Sales作爲輸入將提供兩行;

  • AAA,銷售,27
  • AAA,銷售,29

然後,您可以將該數據傳遞到目標表。

對於第二個問題,在SQL Server中查詢和期望使用逗號分隔值的統一響應是不尋常的。

如果您能夠將數據用於多個搜索和結果行(即,首先搜索行ID 27,然後用ID 29行)然後使用查找任務就足夠了。

否則,可能會進行第二遍(新數據流任務)並使用第一遍臨時表將數據(使用腳本?)合併到所需的csv格式。