1. insert
1)四种格式:
a)
INSERT INTO Table_1( name, fid_fk)
VALUES('tt', 3)
into是可选的;
可以给有默认值的列指定default值:DEFAULT
可以在列名称列表中省略identity列
b)INSERT INTO Table_1
DEFAULT VALUES
c)SET IDENTITY_INSERT dbo.Table_3 ON
INSERT Table_3
SELECT * FROM Table_1
Table_3里面有一个identity列,但是,把IDENTITY_INSERT dbo.Table_3 ON之后,为什么插入还是不成
功那???
d)通过存储过程把结果集合insert进入表中
DROP TABLE tempdb.#temp
CREATE TABLE #temp
( spid smallint,
ecid smallint,
status nchar(30),
loginname nchar(128),
hostname nchar(128),
blk char(5),
dbname nchar(128),
cmd nchar(16),
request_id smallint
)
INSERT INTO #temp EXEC sp_who
SELECT * FROM #temp
2)错误
批命令的密封性,即:批量insert的时候,中间出现错误并不停止,只是记录@@error
3)删除重复行
如果被插入的表中,某列是UNIQUE(不可重复的),那么以insert ... select的形式插入内容的时候,
会把重复的字段删除,只保留单独的一份;
4)bulk insert批量插入
BULK INSERT table_1 FROM '**.BCP'
这时候,为了性能,触发器和约束等不会被触发
2. update
1)会产生Halloween问题。
2)可以使用非常复杂的逻辑控制,比如:
update #temp
set dbname=
case dbname
when 'master' then 'Master'
when 'test' then 'Test'
else 'Other'
end
SELECT * FROM #temp -- 可以使用select top(10) * from ...
3)可以配合cursor来进行update
DECLARE abc CURSOR LOCAL FOR
SELECT c1, c2
FROM dbo.Table1;
OPEN abc;
FETCH abc;
UPDATE dbo.Table1
SET c2 = c2 + d2
FROM dbo.Table2
WHERE CURRENT OF abc; -- 会造成cursor的依次fetch
3. delete
1)也可以配合cursor使用来进行删除
2)Truncate table比delete快,
truncate table Table_1
delete from Table_1
区别:
a)如果有一个列是identity,那么trunc之后,该列从1开始重新计数;而delete之后,该列从上次的值
继续计数。
b)因为Truncate 不是处理的某一行,也就是说,根本就不删除行,也不会触发delete 触发器,而是删
除整页,所以效率会很快;
c) 二者都可以进行rollback transaction进行数据恢复;只不过truncate的log比较少。