2013-12-06 6 views
0

UPDATE К изначальному вопросу:MERGE Заявление об ошибке

Чтобы дать некоторое представление о том, что я делаю. У меня есть таблица с надписью [Staging].[HRIS_EEMaster] в этой таблице - информация о сотрудниках, статус в компании и т. Д. Я использую их персональные идентификационные номера в качестве ключа [PersNo]. У меня есть столбец, который мы недавно добавили, который отображается, если прекращение работника было добровольным или принудительным [Vol_Invol]. Похоже, что в какой-то момент представитель HR не был осторожен и не упустил добавление этой ценности к 4 сотрудникам. Я попытался вернуться к источнику, чтобы исправить эту информацию, но прошло слишком много времени, и я не могу редактировать данные сейчас.

Что я хочу сделать, это обновить поле [Vol_Invol] для 4 сотрудников, используя ключ [PersNo]. Мне нужен сценарий UPDATE, который будет выглядеть на [Staging].[HRIS_EEMaster], найдите [PersNo] для 4 сотрудников, а затем обновите пустое поле [Vol_Invol] с помощью «Добровольные» (эти 4 были все добровольными условиями). У каждого сотрудника есть уникальный [PersNo].

Я добавлю этот скрипт в существующий пакет SSIS. Этот пакет SSIS работает один раз в месяц. Промежуточная таблица усекается, а затем загружается новыми данными. Существует второй пакет с SCD, который передает основную таблицу, которая используется для создания отчетов.

Я хочу добавить скрипт UPDATE к задаче SQL, чтобы он обновлял (исправляет) эти четыре пробела каждый раз, когда данные вытягиваются. Я делаю что-то подобное с приведенным ниже кодом, чтобы исправить недостающие МВЗ, которые были удалены по ошибке.

Надеюсь, это поможет, пожалуйста, дайте мне знать, что вам нужна дополнительная информация.

ОРИГИНАЛЬНЫЙ ПОСТ:

Я работаю на отчет HR и я должен исправить 4 сотрудников, которые отсутствуют в Termination статуса. Раньше я использовал следующее Заявление, чтобы исправить проблемы, связанные с отсутствующими Центрами затрат.

MERGE [Staging].[HRIS_EEMaster] AS tgt 
USING (
    SELECT PersNo AS EmpID, 
     Vol_Invol AS VIStat 
    FROM [dbo].[HRIS_MissingVol_Invol_Status] 
    ) AS src ON src.EmpID = tgt.PersNo 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (
       PersNo, 
       Vol_Invol 
      ) 
     VALUES (
       src.EmpID, 
       src.VIStat 

      ) 
WHEN MATCHED 
    THEN UPDATE 
     SET tgt.PersNo = CASE 
          WHEN src.VIStat > '' THEN src.VIStat 
          ELSE tgt.Vol_Invol 
         END; 

Когда я выполняю скрипт возвращает ошибку:

Msg 245, Level 16, Stat 1, Line 1 
Conversion failed when converting the nvarchar value 'Voluntary' to data type int. 

Я не уверен, что это говорит о том, как я просто пытаюсь поставить слово «добровольный» из таблицы, я создал (см. выше сценарий для имени таблицы) на промежуточную таблицу (также выше), а столбец [Vol_Invol] - это nvarchar (50) в обеих таблицах.

В основном у меня есть 4 человека, у которых отсутствует требуемый статус (историческая информация, которая больше не может быть исправлена ​​в источнике), и я хочу запустить это заявление MERGE, чтобы заменить Blank, который поступает из Monthly Export с правильным значением ,

Этот скрипт будет использоваться как задача SQL в уже существующем процессе SSIS.

+1

Я не думаю, что вы пытаетесь поместить слово «Добровольное» в колонку «Vol_Invol» - вы пытаетесь поместить его в столбец «PersNo». –

+1

Также я бы рассмотрел только использование отдельных инструкций вставки и обновления. ['MERGE' - это гнездо шершней, ожидающее прыжка на вас) (http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/). –

+0

@AaronBertrand, можете ли вы предложить заявление о обновлении? В принципе, если PersNo = «12345», то я хочу, чтобы Vol_Invol был «Добровольным», иначе он должен быть тем, что уже существует. Раньше я делал обновления, но только в том же столбце. –

ответ

4

Похоже, вы пытаетесь установить PersNo в VIStat ...

SET tgt.PersNo = CASE 
          WHEN src.VIStat > '' THEN src.VIStat 
+1

+1 и «PersNo», скорее всего, числовые – Andomar

2

Забудьте MERGE - it is a hornet's nest of issues, и я на самом деле переписать любой код клиента я сталкиваюсь.Почему не просто:

BEGIN TRANSACTION; 

UPDATE trg 
    SET trg.Vol_Invol = CASE 
    WHEN trg.PersNo = 12345 THEN 'Voluntary' 
    WHEN src.VIStat > '' THEN src.VIStat 
    ELSE trg.Vol_Invol END 
FROM Staging.HRIS_EEMaster AS tgt 
INNER JOIN dbo.HRIS_MissingVol_Invol_Status AS src 
ON src.EmpID = tgt.PersNo; 

INSERT Staging.HRIS_EEMaster(PersNo, Vol_Invol) 
    SELECT src.EmpID, src.VIStat 
    FROM dbo.HRIS_MissingVol_Invol_Status AS src 
    WHERE NOT EXISTS 
    (
    SELECT 1 FROM Staging.HRIS_EEMaster 
    WHERE PersNo = src.EmpID 
); 

COMMIT TRANSACTION; 

Если INSERT потребности учитывать условное, а затем изменить эту часть к:

INSERT Staging.HRIS_EEMaster(PersNo, Vol_Invol) 
    SELECT src.EmpID, 
    CASE WHEN src.EmpID = 12345 THEN 'Voluntary' ELSE src.VIStat END 

Но я до сих пор полностью смущены некоторыми аспектами ваших требований - как вы закончили с заявлением MERGE, которое вы сделали, прочитав вашу проблему с текстом, я понятия не имею ...

0

Я использовал следующий скрипт. Потребовалось немного поиграть, но я получил его на работу.

UPDATE [Staging].[HRIS_EEMaster] 
SET [Vol_Invol] = CASE [PersNo] 
    WHEN '2000602' THEN 'Voluntary' 
    WHEN '2050004' THEN 'Voluntary' 
    WHEN '2050234' THEN 'Voluntary' 
    WHEN '2050746' THEN 'Voluntary' 
ELSE [Vol_Invol] 
END 

Пожалуйста, дайте мне знать, если у кого-то есть лучший сценарий.

Смежные вопросы