MERGE продолжает пытаться вставить нуль
Когда я запускаю это, я продолжаю получать:
Msg 515, уровень 16, состояние 2, строка 8
Невозможно вставить значение NULL в столбец «uNSID», таблицу «Flickr.dbo.User_Grps»; столбец не допускает нулей. Ошибка UPDATE.
Заявление было прекращено.
Это мой оператор SQL:
- Функция SQL не возвращает результатов, но содержимое функции возвращает результаты
- Как предотвратить «истечение тайм-аута запроса»? (Ошибка SQLNCLI11 '80040e31')
- Поиск SQL Query Date с использованием Между
- Последовательность SQL Server 2012
- Не удается подключить образец базы данных в SQL Server 2012
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
- microsoft sql server 2012 express edition - ограничение одновременных вставок
- Создание соединения с MDF-файлом в Visual Studio: «Файл используется»
- Ошибка «Недопустимое имя столбца» при вызове вставки после создания таблицы
- Получить файл .sql из базы данных SQL Server 2012
- Настройка состояния NOCOUNT с локальной переменной
- Недостаток узла главной таблицы, SQL Server 2012 SP1
- Операторы * = и = * sql
- Исключение основного ключа SQL
Удалите поля, которые вы уже используете, из обновления, нет необходимости делать это, поскольку они уже были одинаковыми.
Вы можете добавить что-то вроде этого раньше:
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.
Надеюсь это поможет.
Удачи.