#sql #database #merge #automation #sql-server-2017
#sql #База данных #слияние #автоматизация #sql-server-2017
Вопрос:
Я пытаюсь выполнить слияние SQL за несколько шагов до этого.
-
Удалите временную таблицу (если она существует)
-
Создайте временную таблицу (исходный код)
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)
-
Массовая вставка из CSV во временную таблицу
-
Объединить исходную таблицу и целевую таблицу
Я не получаю никаких ошибок при выполнении заданий, но данные не обновляются в моих тестовых сеансах.
Шаг 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.[Фамилия]