SQLServer 深入DML
一、insert语句:
1、4种基本格式
(1) insert [into] targettable [(targetcoloum1[,targetcolumn2])] values (value1[,value2])
(2)insert [into] targettable default values ----所有列都需要有默认值
(3)insert [into] targettable [(targetcoloum1[,targetcolumn2])]
select sourcecolumn1[,sourcecolumn2]
[from sourcetable.....]
(4) insert [into] targettable [(targetcoloum1[,targetcolumn2])] exec sourceprocedurename ----采用存储过程来插入值
2、insert和错误:在sqlserver中默认是如果一组insert在一个批命令中执行,并且其中有一个失败时,其他命令不会受到影响。如果希望有一个insert失败时整个批命令都失败,那在每个insert后检查自动变量@@error并作出相应的反应。如:
create table #test(
id int unique,
name varchar(20) not null);
insert into #test values(1,'a');
if(@@error <> 0) goto list
insert into #test values(2,'b');
if(@@error <> 0) goto list
insert into #test values(2,'c');
if(@@error <> 0) goto list
insert into #test values(4,'d');
list:
select * from #test
在执行到红色标记那一块时,由于发生重复键的异常,下面的insert语句不再执行,转入到select * from #test语句中
3、成批插入:采用bulk insert命令来进行大量数据的载入,如:
create table test (k1 integer,k2 varchar(20))
bulk insert test from 'D:\GG_TS\test.bcp';
默认情况下,bulk insert只执行unique约束,其他约束会被忽略掉。
二、update语句
1、upate和case:如:现有一表title,有字段type,price,现要根据type来更新price字段的值,如:
update title
set price = price * case type when 'kangshifu' then 1.5
when 'jinmailang' then 1.4
else .75
end
2、用update检测约束:
若对有insert触发器的表进行bulk insert后,你会发现触发器不会被触发,若需要进行约束的检查,则可通过一个假的update操作,即简单的将列值置成其本身的值。如:
create table test (k1 integer,k2 varchar(20))
bulk insert test from 'D:\GG_TS\test.bcp';
select * from test
update test set k1=k1,k2=k1.------------------------可通过这样的语句来检查定位非法数据
3、用update 交换列值:定义一个临时变量,采用语句:
declare @temp float
update testtable
set @temp = k1,
k1=k2,
上述方法已经很有效了,但是由于update语句引用的列值通常在操作之前就已经得到本身的值了,因此也可以不需要中间变量,直接使用语句 update testtable set k1 = k2 , k2 = k1s