SSIS посмотреть таблицу вопросов - PullRequest
0 голосов
/ 17 августа 2011

Я использую SSIS (SQL Server 2008) для поиска значений в таблице.Я хотел знать, возможно ли следующее:

Вопрос 1

Таблица поиска 1

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

Я должен передать значения 'Manager_Name' и 'EMP_UNIT' втаблицу поиска и извлечение идентификатора профиля работы в формате через запятую.Как я передам значения «AAA» и «SALES», и я хочу, чтобы возвращаемое значение было 27,29. Как мне это сделать?

Вопрос 2

Таблица поиска 2

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

Мне нужно передать значения идентификатора профиля работы в формате, разделенном запятыми (27, 29), и я хочу получить возвращаемое значение в формате, разделенном запятыми (младший продавец, старший продавец).Возможно ли это в службах SSIS?

Подробности среды: Услуги по интеграции MS SQL Server (ставки) 2008 на сервере Windows 2008

Любая помощь приветствуется,

Спасибо

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Если я правильно понимаю ваш вопрос, вам нужен список названий должностей для данной комбинации менеджера и сотрудника.Если это так, вам нужна хранимая процедура, которая может дать список имен заданий в виде значения, разделенного запятыми.

На мой взгляд, две задачи преобразования поиска кажутся излишними.

На основе данных, представленных в вопросе, в разделе Создание и заполнение таблиц приведены примеры данных.

Создайте следующую хранимую процедуру 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 .

Table data

Снимок экрана # 2 показывает вывод хранимой процедуры для двух различных наборов параметров.

Stored procedure output

Если мне придется использовать это в пакете служб SSIS, я получу список различных комбинаций Manager_Name и Emp_Unit с помощью задачи «Выполнение SQL» и заполню результирующий набор в переменной пакета служб SSIS типа данных Object.

Iбудет затем перебирать переменную объекта, используя 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');
0 голосов
/ 18 августа 2011

Я могу помочь вам с вопросом 1, но я не уверен в вашем втором вопросе.

Чтобы найти один столбец, вы обычно используете компонент LookUp, соответствующим образом сопоставляя столбцы поиска и возвращая соответствующее значение.

SSIS LookUp component

Однако, поскольку вы ожидаете, что будет возвращено несколько значений, это не будет вариант для вас, поскольку компонент LookUp будет возвращать только первое соответствующее значение.

Чтобы получить несколько результатов на начальную строку, вам потребуется использовать два элемента управления исходным кодом (один для основной таблицы и другой для таблицы поиска) вместе с элементом управления Merge Join

SSIS Merge Join control

Элемент управления объединением слиянием позволит вам объединить оба набора данных, однако при наличии нескольких совпадений вы получите несколько строк. Так что в вашем примере AAA и Sales as input будут содержать две строки;

  • ААА, продажа, 27
  • ААА, продажа, 29

Затем вы можете передать эти данные в таблицу назначения.

По второму вопросу необычно запрашивать и ожидать консолидированный ответ с разделенными запятыми значениями в SQL Server.

Если вы можете использовать данные с несколькими строками поиска и результата (то есть сначала искать идентификатор строки 27, а затем строку с идентификатором 29), тогда достаточно использовать задачу поиска.

В противном случае, возможно, сделайте второй проход (новая задача потока данных) и используйте временную таблицу первого прохода для консолидации данных (используя скрипт?) В желаемый формат CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...