2015-06-15 5 views
0

Получаю следующее сообщение при вставке нескольких записей в таблицу. Достаточно справедливо, что данные недействительны и не могут быть вставлены. Но как я могу сказать SQL, чтобы вставить все допустимые.Невозможно вставить значение NULL в столбец XXX. INSERT терпит неудачу. Вставить только действительное

В настоящее время, когда я получаю эту ошибку, вся вставка выходит из строя. Но я бы хотел, чтобы SQL не вставлял недопустимые строки, но вставлял все допустимые строки.

Я использую синтаксис, подобный этому

INSERT INTO myNewTable (columnName1, columnName2, columnName3) 
    SELECT myValue1, myValue2, myValue3 
    FROM myOldTable 

Я не могу изменить SQL, чтобы исключить значения в ИНЕКЕ, потому что эта база данных использует ETA как структуры таблицы, но если эта таблица настроена неправильно, то это когда моя вставка терпит неудачу.

мне интересно, если есть настройки или утверждение, что я могу назвать первым перед вставкой, так же, как при установке IDENTITY_INSERT быть включен, или что-то

+0

Использование 'where' условие, чтобы отфильтровать неверные записи из источника может быть хорошим вариантом – Raj

+0

Вы не можете вставить NULL значения столбцов помечается как не нулевой. Вы должны обязательно использовать предложение where для удаления нулей. –

+0

. Добавить в ваш оператор select. _Where NOT NULL_ –

ответ

1

Предполагая, что один из myValue1, myValue2, myValue3 на самом деле NULL , и существует ограничение NOT NULL для некоторых столбцов таблицы myNewTable, вы можете просто выбрать те значения, где ограничение не нарушается с помощью предложения WHERE.

INSERT INTO myNewTable (columnName1, columnName2, columnName3) 
SELECT myValue1, myValue2, myValue3 
FROM myOldTable 
WHERE myValue1 IS NOT NULL; --myValue2 and myValue3 can also be added 
          --with OR if your table structure has those columns 
          --defined to be NOT NULL too 

Здесь, вместо того, чтобы беспокоиться о том, чтобы только действительные значения, вставленные и недействительные те выпадают, вы просто избежать недопустимые значения вообще. Это лучшее решение, а не поиск способа игнорировать нарушения ограничений.

0

попробовать эту

INSERT INTO myNewTable (columnName1, columnName2, columnName3) 
    SELECT myValue1, myValue2, myValue3 
    FROM myOldTable 
    where myValue1 is not null 
      and myValue2 is not null 
      and myValue3 is not null 
1

Вы можете создать instead of trigger на целевой таблице, отфильтровывает недействительные строки.

create table dbo.T(ID int not null); 

go 

create trigger dbo.TT on dbo.T 
instead of insert as 
begin 
    insert into T(ID) 
    select ID 
    from inserted 
    where ID is not null; 
end 

go 

insert into dbo.T values(1),(null); 

select * from T; 

Результат:

ID 
----------- 
1 
Смежные вопросы

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