MERGE продолжает пытаться вставить нуль

Когда я запускаю это, я продолжаю получать:

Msg 515, уровень 16, состояние 2, строка 8
Невозможно вставить значение NULL в столбец «uNSID», таблицу «Flickr.dbo.User_Grps»; столбец не допускает нулей. Ошибка UPDATE.
Заявление было прекращено.

Это мой оператор SQL:

MERGE INTO User_Grps as ug USING [ExcImport-S2 (3)] as i ON ( ug.uNSID = i.uNSID and ug.prime_ID = i.prime_ID and i.uNSID is not null ) WHEN MATCHED and i.uNSID is not null THEN UPDATE SET ug.uNSID = i.uNSID , ug.gNSID = i.gNSID , ug.gAlias = isnull(i.gAlias,ug.gAlias) , ug.Prime_ID = i.Prime_ID WHEN NOT MATCHED THEN INSERT (uNSID , gNSID , gAlias , Prime_ID ) VALUES (i.uNSID , i.gNSID , i.gAlias , i.Prime_ID ); GO 

Что мне нужно сделать, чтобы остановить его от сосания нулевых записей?

Кроме того, как мне настроить счетчики, так что в конце я могу получить что-то вроде Updated x,xxx records & added xxx ?

Изменить для добавления ————–

@Kevin: Это мой код после того, как я его модифицировал, когда понял ваш ответ.

Когда я запускаю его как есть, я получаю следующие ошибки:

 Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '$ACTION'. Msg 137, Level 15, State 1, Line 5 Must declare the scalar variable "@InsertCount". Msg 1087, Level 15, State 2, Line 9 Must declare the table variable "@RowCounts". 

Когда я прокомментирую часть между -- ############################################
строк, я получаю следующую ошибку:
Msg 2627, Level 14, State 1, Line 13 Violation of PRIMARY KEY constraint 'PK_User_Grps'. Cannot insert duplicate key in object 'dbo.User_Grps'. The duplicate key value is (GT10464608)

 SET NOCOUNT ON ; DECLARE @RowCounts TABLE ( MergeAction NVARCHAR(10) ) ; DECLARE @InsertCount INT , @UpdateCount INT; Merge into User_Grps as ug using [ExcImport-S2] as i on ( ug.uNSID = i.uNSID and ug.prime_ID = i.prime_ID and i.uNSID is not null ) WHEN MATCHED THEN UPDATE SET ug.gNSID = i.gNSID , ug.gAlias = isnull(i.gAlias,ug.gAlias) , ug.last_ud = GETDATE ( ) WHEN NOT MATCHED THEN -- UPDATE SET @i += 1; INSERT (uNSID , gNSID , gAlias , Prime_ID , Last_UD ) VALUES (i.uNSID , i.gNSID , i.gAlias , i.Prime_ID , GETDATE ( ) ); -- ############################################ OUTPUT 

Удалите поля, которые вы уже используете, из обновления, нет необходимости делать это, поскольку они уже были одинаковыми.

Вы можете добавить что-то вроде этого раньше:

 SET NOCOUNT ON ; DECLARE @RowCounts TABLE ( MergeAction NVARCHAR(10) ) ; DECLARE @InsertCount INT , @UpdateCount INT; 

А потом это сразу после слияния:

  OUTPUT $ACTION INTO @RowCounts ; SELECT @InsertCount = [INSERT] , @UpdateCount = [UPDATE] FROM ( SELECT MergeAction , 1 AS ROWS FROM @RowCounts ) P PIVOT ( COUNT(ROWS) FOR MergeAction IN ( [INSERT], [UPDATE] ) ) AS PVT ; 

Это даст вам количество строк.

Редактировать:

Ссылка для получения дополнительной информации о разделе OUTPUT http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop-worrying-and-love-the -merge.aspx

Весь shebang:

 SET NOCOUNT ON ; DECLARE @RowCounts TABLE ( MergeAction NVARCHAR(10) ) ; DECLARE @InsertCount INT , @UpdateCount INT; Merge into User_Grps as ug using [ExcImport-S2] as i on ( ug.uNSID = i.uNSID and ug.prime_ID = i.prime_ID and i.uNSID is not null ) WHEN MATCHED THEN UPDATE SET ug.gNSID = i.gNSID , ug.gAlias = isnull(i.gAlias,ug.gAlias) , ug.last_ud = GETDATE ( ) WHEN NOT MATCHED THEN -- UPDATE SET @i += 1; INSERT (uNSID , gNSID , gAlias , Prime_ID , Last_UD ) VALUES (i.uNSID , i.gNSID , i.gAlias , i.Prime_ID , GETDATE ( ) ) OUTPUT $ACTION INTO @RowCounts ; SELECT @InsertCount = [INSERT] , @UpdateCount = [UPDATE] FROM ( SELECT MergeAction , 1 AS ROWS FROM @RowCounts ) P PIVOT ( COUNT(ROWS) FOR MergeAction IN ( [INSERT], [UPDATE] ) ) AS PVT ; 

Из Microsoft вы должны удалить свой, and i.uNSID is not null из вашего предложения ON и просто сохраните его в своих предложениях WHEN . Это заставляет меня предположить, что вам нужно добавить его в другое предложение WHEN , чтобы устранить ошибку:

 WHEN NOT MATCHED and i.uNSID is not null THEN 

И вот некоторые из соответствующих заметок от MS:

Укажите условия поиска в предложении ON, которые определяют критерии для сопоставления данных в исходной и целевой таблицах. То есть укажите только столбцы из целевой таблицы, которые сравниваются с соответствующими столбцами исходной таблицы.

Укажите условие поиска фильтрации строк в соответствующем предложении WHEN. Например, КОГДА НЕ СОГЛАСЕН, а S.EmployeeName LIKE 'S%' THEN INSERT ….

Определите представление источника или цели, которая возвращает отфильтрованные строки и ссылается на представление в качестве исходной или целевой таблицы. Если представление определено в целевой таблице, любые действия против него должны удовлетворять условиям для обновления представлений. Дополнительные сведения об обновлении данных с помощью представления см. В разделе «Изменение данных через представление».

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

Надеюсь это поможет.

Удачи.

  • Экземпляр по умолчанию для SQL Server 2012 не работает
  • Есть ли способ генерировать миллионные адреса mac более эффективно?
  • Получить размер вставленной строки в SQL Server
  • Вставьте 2 значения из двух разных таблиц в одну таблицу
  • Разрешить удаленное подключение только для определенных пользователей
  • как вставить значение в таблицу типов данных изображения
  • Скрытие баз данных для входа в Microsoft Sql Server 2008R2 и выше
  • Как просмотреть запрос, который использовался для создания таблицы?
  • SQL Server - та же таблица в нескольких схемах
  • Сбой базы данных SQL Server 2012 Express
  • Невозможно создать хранимую процедуру с параметром вывода таблицы
  • Давайте будем гением компьютера.