如何在将空值插入非空列SQL Server时设置默认值?

时间:2016-04-20 06:02:17

标签: sql sql-server insert ssms default

我有两张表t1t2。两者都有idname列。 t1的名称列定义为非空,其默认值为'彼得'。

我想将t2中的所有值插入到我的t1表中。但是我在t2表中有一些空值。当我尝试插入值时:

Insert into t1 
   select * 
   from t2;

它抛出了这个错误:

  

Msg 515,Level 16,State 2,Line 1
  无法将值NULL插入列'名称',表' T1&#39 ;;列不允许空值。

当我们尝试insert null值时,是否有可能将默认值设置为列。

4 个答案:

答案 0 :(得分:6)

第一个解决方案,

   insert into t1
    select id,isnull(name,'Peter') from t2

第二个解决方案

ALTER TABLE T1 ALTER COLUMN name varchar(255) NULL

insert into t1
select id,name from t2

ALTER TABLE T1 ALTER COLUMN name varchar(255) NOT NULL

第三种解决方案:(最好)

    Declare @GetDefaultValue varchar(255)

    SELECT  @GetDefaultValue= COLUMN_DEFAULT
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
      AND TABLE_NAME = 'T1'
      AND COLUMN_NAME = 'name'


 insert into t1 select id,isnull(name,@GetDefaultValue) from t2

答案 1 :(得分:2)

所以而不是

Insert into t1 select * from t2

您可以将查询重写为

Insert into t1 
select col1,col2, ISNULL(name, 'Peter'), othercolumns from t2

答案 2 :(得分:2)

使用COALESCE

<强>查询

INSERT INTO t1(Id, Name)
SELECT Id, COALESCE(Name, 'Peter') FROM t2;

或者您可以使用CASE表达式。

<强>查询

INSERT INTO t1(Id, Name)
SELECT Id, CASE WHEN Name IS NULL THEN 'Peter' ELSE Name END
FROM t2;

答案 3 :(得分:1)

修改您的查询,如:

window.onload = function(){ var addBtn = document.querySelectorAll(".add"); for(var i = 0; i < addBtn.length; i++){ addBtn[i].onclick = addTime; } }; function addTime(){ var update = parseInt(this.parentElement.getElementsByTagName("SPAN")[0].innerHTML) + 1; var digits = this.parentElement.parentElement.querySelectorAll(".digit"); if(digits.indexOf(this.parentElement) % 2){ //Uncaught TypeError: digits.indexOf is not a function }else{ carryOn(this, update); } }

有关详细信息,请参阅以下链接

http://www.w3schools.com/sql/sql_isnull.asp