版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
目录
- INSERT
- UPDATE
- DELETE
- 用TOP限制修改
- OUTPUT
1.INSERT
- INSERT & VALUES
1)insert语句不指定列值:identity属性列、默认值列、计算列
2)一个insert一次最多插入1000行
insert into tablle_or_view [(col_list)]
values
(value_lis_1),
...
- INSERT & SELECT
将查询结果插入另一个表。
select * from tt.dbo.pivot_voc
go
create table tt.dbo.item_pivot(item varchar(20), blue int, yellow int, red int)
go
insert into tt.dbo.item_pivot select * from tt.dbo.pivot_voc
go
select * from tt.dbo.item_pivot
- INSERT & EXEC
将PROC
或动态SELECT语句
返回的结果集写入现有表。
USE master
GO
IF DB_ID('tt') IS NOT NULL
DROP DATABASE tt
GO
CREATE DATABASE tt
GO
CREATE TABLE tt.dbo.voc
(
item varchar(20),
color varchar(20),
quantity int
)
INSERT INTO tt.dbo.voc
VALUES
('Chair', 'blue', 1), ('Chair', 'blue', 2),
('Chair', 'red', 3), ('yizi', 'red', 1),
('yizi', 'blue', 6)
GO
SELECT * FROM tt.dbo.voc
GO
USE tt
GO
-- 存储过程创建、删除时不能用:dbname.dbo.表名?
IF OBJECT_ID('dbo.getTopN') IS NOT NULL
DROP PROC dbo.getTopN
GO
CREATE PROC getTop
@n int,
@rc int output
AS
SELECT TOP(@n) * FROM tt.dbo.voc
SET @rc = @@ROWCOUNT
GO
IF OBJECT_ID('tempdb..#T') IS NOT NULL
DROP TABLE #T
GO
CREATE TABLE #T
(
item varchar(20),
color varchar(20),
quantity int
)
GO
DECLARE @rc int
INSERT INTO #T
EXEC getTop @n = 3, @rc = @rc output
SELECT @rc
SELECT * FROM #T
GO
-- DROP TABLE #T
注:删除临时表tempdb..#T
;TOP返回不确定行。
- SELECT INTO
创建新表并插入查询结果集。
注:不能创建已分区表,即使源表已分区, 也不会使用源表的分区方案。
2.UPDATE
- SET & WHERE
UPDATE T1
SET col1 = val1, ... coln = valn
WHERE exp
- FROM
select distinct item, color
into tt.dbo.voc_
from tt.dbo.voc
alter table tt.dbo.voc_
add Qt_sum float
select * from tt.dbo.voc_
update tt.dbo.voc_
set Qt_sum = Qt.Qt_sum
from (select item, color, sum(quantity) AS Qt_sum
from tt.dbo.voc
group by item, color) Qt
- CTE & VIEW
当使用FROM
子句进行更新时,子查询会比较复杂,结合使用CTE或VIEW可得到简化。
-- cte
with cte_qt_sum as
(
select item
, color
, sum(quantity) AS Qt_sum
from tt.dbo.voc
group by item, color
)
update tt.dbo.voc_
set Qt_sum = C.Qt_sum
from cte_qt_sum C
GO
select * from tt.dbo.voc_
GO
-- view
CREATE VIEW v_qt_sum
AS
(
SELECT item
, color
, SUM(quantity) AS Qt_sum
FROM tt.dbo.voc
GROUP BY item, color
)
GO
UPDATE tt.dbo.voc_
SET Qt_sum = V.Qt_sum
FROM v_qt_sum V
GO
SELECT * FROM tt.dbo.voc_
GO
DROP VIEW v_qt_sum
3.DELETE
- DELETE
DELETE table_or_view
FROM T1
WHERE 条件
注:默认table_or_view与T1相同时,可省略。但当使用OUTPUT时,一般不省略。
- TRUNCATE TABLE
删除全部行,速度更快,且使用更少资源。
4.用TOP限制修改数量
注:在已分区视图中不能将TOP与UPDATE、DELETE语句一起用。
DELETE TOP(1) FROM tt.dbo.voc_
WHERE Qt_sum = 1
GO
INSERT TOP(2) INTO tt.dbo.voc_
VALUES
('chair', 'red', 1), ('yizi', 'red', 2)
GO
UPDATE TOP(1) tt.dbo.voc_
SET color = 'blue'
WHERE item = 'chair'
AND color = 'red'
GO
5.OUTPUT语句
输出受影响行信息
-- 临时表inserted, deleted
INSERT INTO tt.dbo.voc_
OUTPUT inserted.*
VALUES
('yizi', 'red', NULL)
GO
DELETE FROM tt.dbo.voc_
OUTPUT deleted.*
WHERE color = 'red'
GO
UPDATE tt.dbo.voc_
SET Qt_sum = 1
OUTPUT deleted.*, inserted.*
GO
-- OUTPUT -> INTO
DELETE FROM tt.dbo.voc_
OUTPUT deleted.*
INTO tt.dbo.voc_
WHERE item = 'yizi'
GO