Помощь с инструкцией слияния SQL

#sql #database #merge #automation #sql-server-2017

#sql #База данных #слияние #автоматизация #sql-server-2017

Вопрос:

введите описание изображения здесьДобрый день,

Я пытаюсь выполнить слияние SQL за несколько шагов до этого.

  1. Удалите временную таблицу (если она существует)

  2. Создайте временную таблицу (исходный код)

    USE Kronos Create table #tempGlobal --Source ( [800#] [bigint] NOT NULL, [FirstName] [varchar](20) NOT NULL, [MI] CHAR(20) NULL, [LastName] [nvarchar](30) NOT NULL, [NickName] CHAR(15) NULL, [Position] [nvarchar](50) NULL, [Department] [varchar](30) NULL, [EmployeeStatus] [char](20) NOT NULL, [CredentialDocument] VARCHAR(10) NOT NULL, [RehireDate] [date] NULL, [DateHired] [date] NOT NULL, [DateTerminated] [date] NULL)

  3. Массовая вставка из CSV во временную таблицу

  4. Объединить исходную таблицу и целевую таблицу

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

Шаг 4:

 `      Select t.[800#], t.[FirstName], t.[MI], t.[LastName], t.[NickName], t.[Position],                   t.[Department], t.[EmployeeStatus], t.[CredentialDocument], t.[RehireDate], t.[DateHired], t.[DateTerminated]
        From [dbo].[Employees] t --Target
        Merge [dbo].[Employees] t
        using [dbo].[#tempGlobal] s --Source Temp Table
        on t.[800#] = s.[800#] --Stays the same even if rehired
        WHEN MATCHED 
        AND 
        ( 
        s.[LastName] <> t.[LastName]
        OR s.[Position] <> t.[Position]
        OR s.[Department] <> t.[Department]
        OR s.[EmployeeStatus] <> t.[EmployeeStatus]
        OR s.[RehireDate] <> t.[RehireDate]
        OR s.[DateTerminated] <> t.[LastName]
        )
        THEN
        UPDATE SET LastName = s.LastName,
        Position = s.Position,
        Department = s.Department,
        EmployeeStatus = s.EmployeeStatus,
        RehireDate = s.RehireDate,
        DateTerminated = s.DateTerminated

        WHEN NOT MATCHED --Source table doesn't match target table so we need to update the target     table to match
        THEN INSERT 
        (
        [800#], 
        [FirstName],
        [MI], 
        [LastName], 
        [NickName],
        [Position],
        [Department],
        [EmployeeStatus],
        [CredentialDocument],
        [RehireDate], 
        [DateHired], 
        [DateTerminated])
        VALUES 
        (
        s.[800#],
        s.FirstName,
        s.MI,
        s.LastName,
        s.NickName,
        s.Position,
        s.Department,
        s.EmployeeStatus,
        s.CredentialDocument,
        s.RehireDate,
        s.DateHired,
        s.DateTerminated);`

   
  

Комментарии:

1. Слияние выглядит нормально. Можете ли вы добавить код, который вы генерируете и заполняете #tempGlobal ? Кроме того, вы подтвердили, что временная таблица действительно заполняется после массовой вставки?

2. #tempGlobal действительно заполняется. Если я запускаю слияние само по себе, я получаю это: (затронута строка 1064) Сообщение 241, уровень 16, состояние 1, строка 28 Преобразование не удалось при преобразовании даты и / или времени из символьной строки. Время завершения: бла-бла-бла

3. Вы можете отредактировать свой вопрос, чтобы включить эту информацию. Так будет лучше, поскольку он будет форматироваться лучше, чем комментарий.

4. Похоже, у вас где-то возникла проблема со строкой формата даты при преобразовании ее в столбец даты SQL Server. Пожалуйста, добавьте некоторые образцы данных из вашего исходного файла CSV.

5. Я понял это. Это неверно в коде Или s.[Дата определена] <> t.[Фамилия]