无法将值NULL插入列XXX。 INSERT失败。插入仅有效

时间:2015-06-15 09:24:51

标签: sql sql-server

将多个记录插入表格时,我收到上述消息。足够公平,数据无效,无法插入。但是我怎么能告诉SQL插入所有有效的。

目前,当我收到此错误时,整个插入失败。但我希望SQL不插入无效行,但插入所有有效行。

我使用的语法与此类似

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

我无法更改SQL以排除WHERE子句中的值,因为此数据库使用类似ETA的结构表,但如果此表配置不正确,则表示插入失败。

我想知道在插入之前是否有我可以先调用的设置或语句,就像将IDENTITY_INSERT设置为ON或其他内容

3 个答案:

答案 0 :(得分:1)

假设myValue1myValue2myValue3中的一个实际为NULL,并且表myNewTable的某些列上存在NOT NULL约束,您只需选择那些使用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

这里,您不必担心只插入有效值而忽略无效值,而只是完全避免使用无效值。这是一个更好的解决方案,而不是找到忽略约束违规的方法。

答案 1 :(得分:1)

您可以在目标表上创建一个过滤掉无效行的instead of trigger

[int(x1) + int(x2) for x1,x2 in zip(l1, l2)]

结果:

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;

答案 2 :(得分: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