【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句
原文:【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句
DELETE语句
-
--建表
-
select * into distribution
-
from sys.objects
-
-
-
--1.当delete语句要关联其他表时与update语句类似,可参考上面update语句的写法
-
-
--2.truncate table语句删除行比delete快很多,不过必须一次删除所有的行(没有where子句)
-
--之所以快是因为记录的日志很少,采用表级别锁。
-
--如果表中有IDENTITY列,会被重置为列定义的种子值4、TOP--1.在一个事务中删除所有记录,此表的记录有1000w条
-
delete from distribution
-
-
--2.通过top每次只删除1000条记录
-
while (select COUNT(*) from distribution) > 0
-
begin
-
delete top (1000)
-
from distribution
-
end
-
-
/*===============================================================
-
比较1和2(不只限于delete,还包括update、insert),2有以下优点:
-
-
1.每次操作1000条,就提交一次,那么产生少量的日志,使日志空间更容易被重用;
-
如果一次删除大量记录,而产生的大量日志可能比整个日志文件还大,
-
那么会引起日志文件的自动增长,会影响性能
-
-
2.分块操作记录,一次锁住更少的记录,占用更少的锁资源,
-
锁定时间更短,操作完成后这些记录可被其他进程访问,并发性更好
-
=================================================================*/
OUTPUT子句
-
create table t(vid int not null,pic varchar(10) not null)
-
-
insert into t
-
values(1,'abc'),
-
(2,'def'),
-
(3,'hjkl')
-
-
--output必须写在where子句之前
-
update t
-
set pic = 'xyz' --更新操作由删除+添加组合的
-
output deleted.vid, --删除的记录
-
deleted.pic,
-
-
inserted.vid, --添加的记录
-
inserted.pic
-
where vid < 100
-
-
--output写在values之前
-
insert into t(vid,pic)
-
output inserted.*
-
values(5,'mn')
-
-
-
declare @temp table(vid int,pic varchar(10))
-
-
delete from t
-
output deleted.vid, --引用所有字段deleted.*
-
deleted.pic into @temp
-
where vid < 100
output子句的一个应用,由于主表和附表是级联删除的,需要实现删除主表记录时,自动保存主表和附表中相关重要字段的值:
-
-
-
--创建主表
-
create table t1(id int primary key,v varchar(10))
-
-
--创建附表,级联删除
-
create table t2
-
(
-
idd int,
-
id int foreign key references t1(id) on delete cascade,
-
vv varchar(20)
-
)
-
-
insert into t1
-
select 1,'a' union all
-
select 2,'b'
-
-
insert into t2
-
select 1,1,'www' union all
-
select 1,2,'csdn'
-
-
-
--创建存储删除的t1表的字段
-
create table temp_t1_delete(id int,v varchar(10))
-
-
--创建存储删除的t2表的字段
-
create table temp_t2_delete(id int,vv varchar(20))
-
go
-
-
--创建表t2的delete触发器
-
create trigger dbo.trigger_t2_delete
-
on dbo.t2
-
for delete
-
as
-
begin
-
insert into temp_t2_delete(id,vv)
-
select id,vv
-
from deleted
-
end
-
go
-
-
-
--删除主表记录,自动把删除的主表记录,保存在temp_t1_deletei表中
-
delete from t1
-
output deleted.id, --引用所有字段deleted.*
-
deleted.v into temp_t1_delete
-
where id = 1
-
-
-
-
--查询已删除的记录
-
select *
-
from temp_t1_delete t1
-
left join temp_t2_delete t2
-
on t1.id = t2.id
-
/*
-
id v id vv
-
1 a 1 www
-
*/
MERGE语句
-
create table t_org(org_id int,
-
v1 varchar(20),
-
v2 varchar(30));
-
insert into t_org
-
select 1,'org1',''
-
union all
-
select 2,'org2','name2'
-
union all
-
select 3,'org3','name3'
-
union all
-
select 4,'org4','name4'
-
union all
-
select 5,'org5','name5'
-
-
-
create table t_store(org_id int,
-
v1 varchar(20),
-
v2 varchar(30));
-
insert into t_store
-
select 1,'org1',''
-
union all
-
select 2,'org2-t','name2-t'
-
union all
-
select 3,'org3-t','name3-t'
-
union all
-
select 4,'org4-t','name4-t'
-
union all
-
select 5,'org5-t','name5-t'
-
union all
-
select 6,'org6-t','name6-t'
-
union all
-
select 7,'org7-t','name7-t'
-
-
--生成临时表
-
select * into #t_org from t_org
-
select * into #t_store from t_store
-
-
--定义表变量
-
declare @delete_insert_t_org table(
-
change nvarchar(100),
-
org_id int,v1 varchar(20),v2 varchar(30), --删除的
-
org_id_t int,v1_t varchar(20),v2_t varchar(30)) --添加的
-
-
-
;with mm --作为merge语句中using的内部派生表
-
as
-
(
-
select m.org_id,
-
m.v1,
-
m.v2
-
from #t_store m
-
where m.org_id >1
-
)
-
-
--注意:表 with(tablock),另外通过top关键字只是处理3条记录
-
merge top (3) into #t_org with (tablock) as b
-
using (
-
select *
-
from mm with (tablock) --引用上面CTE公用表表达式产生的内部派生表
-
) m
-
on m.org_id = b.org_id --为了区分是否需要修改,可以增加一个字段来区分,
-
--但是这个字段不应该作为关联条件,
-
--因为会导致接下来运行的merge分块语句把刚才目标表中update过的那条记录,
-
--重复插入目标表中,而是写在when的条件中
-
-
when matched and b.v1 <> m.v1 and isnumeric(m.org_id) = 1 --可以在这里写:区分字段过滤条件
-
then update set v1 = m.v1,v2 = m.v2
-
-
when not matched by target --目标表中没有
-
then insert (org_id,v1,v2) values(m.org_id,m.v1,m.v2) --不可通过values关键字一次添加多列
-
-
when not matched by source --源表中没有
-
then delete
-
-
output $action, --操作:delete、insert、update
-
inserted.org_id,
-
inserted.v1,
-
inserted.v2 , --可改为inserted.*
-
-
deleted.org_id,
-
deleted.v1,
-
deleted.v2 --可改为deleted.*
-
-
INTO @delete_insert_t_org --output的输出放入表变量中
-
-
--关联提示
-
option (loop join); --注意:merge必须以分号结尾
-
-
-
select * from @delete_insert_t_org
【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句的更多相关文章
- SQL server 学习笔记1
1.查询安装的排序规则选项喝当前的排序规则服务器属性 select * from fn_helpcollations(); 2.查看当前服务器的排序规则 select serverproperty(' ...
- sql server 学习笔记 ( backup 备份方案 )
做个记入就好 USE [master] SELECT bs.database_name AS 'Database Name', bs.backup_start_date AS 'Backup Star ...
- 【SQL Server学习笔记】事务、锁定、阻塞、死锁 sys.sysprocesses
http://blog.csdn.net/sqlserverdiscovery/article/details/7712068 Column name Data type Description ...
- SQL SERVER学习笔记:临时表与表变量
本文主要摘自徐海蔚的<Microsoft SQL SERVER企业级平台管理实践> 表变量可以作为存储过程的返回参数,而临时表不行.(存疑?表值参数只在SQL SERVER2008才开始支 ...
- sql server 学习笔记 (nested transaction 嵌套事务)
什么时候会用到嵌套事务 ? 为了代码复用,我们会写许多的储蓄过程,而中间如果需要使用到 transaction 难免就会发生嵌套了. sql server 并不直接支持嵌套事务. 但它可以用一些招式来 ...
- Sql Server学习笔记
1.指定路径创建数据库 create database student on--创建库的时候必须写 ( name=student, filename='E:\database\student.mdf' ...
- sql server 学习笔记 ( row_number, rank, dense_rank over partition by order by )
refer : https://blog.csdn.net/winer2008/article/details/4283539 https://www.cnblogs.com/linJie193090 ...
- sql server 学习笔记
1. 修改student表中sdept字段改为varchar类型,长度为30,并且不为空 ) not null 2. 删除student表中的address列 alter table student ...
- 【SQL SERVER学习笔记】Sqlserver游标的尝试
DECLARE @ProName NVARCHAR(50)DECLARE @CityName NVARCHAR(50)DECLARE @ProId INT DECLARE @CityId INT DE ...
随机推荐
- PEP 442 -- Safe object finalization
https://www.python.org/dev/peps/pep-0442/ PEP 442 -- Safe object finalization PEP: 442 Title: Safe o ...
- web手工项目01-系统组织框架-测试流程-需求评审-测试计划与方案
回顾 SVN(定义,作用,使用操作) 软件缺陷(定义,表现形式,原因和根源,基本内容,跟踪流程) JIRA(基本介绍,使用者,工作流,问题,使用) 学习目标 掌握WAMP的环境搭建 掌握熟悉项目的步骤 ...
- 123457123456#0#-----com.twoapp.ErTongHuaHua01--前拼后广--儿童绘画填色游戏jiemei
com.twoapp.ErTongHuaHua01----儿童绘画填色游戏jiemei
- python之socket编程(二)
标签(空格分隔): socket编程 SocketServer解析 SocketServer内部使用I/O多路复用,多线程,多进程来实现客户端多并发访问Socket服务端,while循环时使用I/O多 ...
- Infos - 通过搜索引擎获取信息与数据
常用搜索引擎命令 site 用来查询网站收录量. 比如site:http://www.cnblogs.com/ inurl 查URL中包含的元素,比如inurl:bbs ,搜索出URL包含bbs的页面 ...
- 移动端自动化测试之adb常用命令
今天我们来聊聊自动化测试过程中常用的adb命令. 简介 首先介绍下什么是adb,adb全称叫“android debug bridge”,翻译过来就叫调试桥,通过命令行指令,可让你与移动端设备进行相互 ...
- 第一篇博客==>Hello_World
1,为什么写博客? 大佬都说程序员需要写博客的说,被无数到的大佬帮我洗脑之后,慢慢也发现了写博客的好处,写博客我认为主要有以下几个作用: 1.打开博客,记录世界记录你.emmm 2.可以把自己的一些经 ...
- 查询父节点parentNode
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOCTYPE htm ...
- requirejs r.js 打包报错paths fallback not supported in optimizer please provide a build config path override for jquery
错误原因: 改为:
- bootstrapvalidator API 文档地址: http://bootstrapvalidator.votintsev.ru/api/
bootstrap验证插件 bootstrapvalidator 文档API 地址 (原始作者英文):http://bootstrapvalidator.votintsev.ru/api/ 具体使用( ...
