1,MERGE INTO 语句:

这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE,作用还是很强大的(简单的说就是它可以批量更新和插入处理一个数据集,如果存在就更新指定列,不存在就插入)

/****** MERGE INTO 语句运用实例 ******/
-- =============================================
-- Author: <Author,yuanchen,Name>
-- Create date: <Create Date,,>
-- Description: <Description,将数据批量新增或更新到[dbo].[Table]中,ID为主键自增>
-- =============================================
Create PROCEDURE [dbo].[AddOrUpdateTable]
@Roles UDT_Table READONLY,--用户自定义表类型(相当于一个传入的临时表)
@ReturnValue INT OUTPUT --返回值
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
MERGE INTO [dbo].[Table] AS TARGET --此处[dbo].[Table]是需要插入或更新数据的表
USING (SELECT * FROM @UDT_Table) AS SOURCE
ON TARGET.ID = SOURCE.ID --根据此处的列作为条件判断是新增还是更新(多个列作为条件用and连接)
WHEN MATCHED
THEN UPDATE
SET
TARGET.[A]=SOURCE.[B],
TARGET.[B]=SOURCE.[B],
TARGET.[UpdateTime]=getdate() --内置函数获取当前时间
WHEN NOT MATCHED
THEN INSERT
([A],[B],[CreateTime])
VALUES(SOURCE.[A],SOURCE.[B],getdate());
SET @ReturnValue = 1
COMMIT TRAN
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
--此处可以用Error_message()函数记录日志,千万不要在ROLLBACK TRANSACTION前面记录日志,会被回滚
SET @ReturnValue = -1
END;
END CATCH
END

2,WITH XXX AS  语句:

WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。 
特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。(更高效,可读性更好,复杂的子查询推荐使用)

With [Table1] As(
select * from [A] inner join [B] on [A].ID=B.[A_ID] --A表和B表连表查询
),[Table2] As(
select * from [C] inner join [Table1] T on [C].ID=T.[C_ID] --C表和A,B表的查询结果连表查询
)Select * From [Table2] --上面的查询结果等同于下面这段Sql
select * from [C] inner join (select * from [A] inner join [B] on [A].ID=B.[A_ID]) T on [C].ID=T.[C_ID]

3,游标的常规使用,游标可以遍历数据集对每条数据的指定列做处理,处理数据的能力也是相当强大的,但是滥用和使用不当可能对造成性能问题哦,而且处理复杂的多表多条数据时一般都要配合事务一起使用,不然一旦程序错误就会产生错误数据

/****** 游标的使用实例  ******/
-- =============================================
-- Author: <Author,yuanchen>
-- Create date: <Create Date,>
-- Description: <Description,>
-- =============================================
Create Proc [dbo].[Proc_CURSOR_USE]
AS
BEGIN
SET NOCOUNT ON; DECLARE @ID BIGINT --定义变量
DECLARE @A BIGINT
DECLARE @B NVARCHAR(100) Select * INTO #Table From [Table] --将查询结果放入临时表
--定义游标
DECLARE CURSOR_JOB01 CURSOR FOR
Select [ID],[A],[B] From #Table --此处可以不用临时表,直接写查询语句,但在实际的业务处理中我们需要的查询结果可能是通过复杂的查询语句得到的,直接写在此处,可读性较差
OPEN CURSOR_JOB01
FETCH CURSOR_JOB01 INTO @ID,@A,@B
BEGIN TRY
BEGIN TRANSACTION
WHILE (@@FETCH_STATUS=0)
BEGIN
--此处可以编写逻辑代码,即对游标遍历的当前数据做处理,例如:如果当前数据列A>0,那么就向[BaseLog]表记录一条日志
IF(@A>0)
Begin
Insert into BaseLog([CONTENT],[CreateTime],[Pro_Name]) values('ID为:'+CONVERT(varchar(10),@ID)++'的A列的值大于0',getdate(),'[Proc_CURSOR_USE]'); --记录错误日志
End
FETCH CURSOR_JOB01 INTO @ID,@A,@B
END
CLOSE CURSOR_JOB01
DEALLOCATE CURSOR_JOB01
COMMIT
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
Insert into BaseLog([CONTENT],[CreateTime],[Pro_Name]) values(Error_message(),getdate(),'[Proc_CURSOR_USE]'); --记录错误日志
IF CURSOR_STATUS('local','CURSOR_JOB01') <> -3
BEGIN
IF CURSOR_STATUS('local','CURSOR_JOB01') <> -1
BEGIN
CLOSE CURSOR_JOB01
DEALLOCATE CURSOR_JOB01
END
END
END;
END CATCH
DROP TABLE #Table --清除临时表
END

几个很好用SQL语法(SqlServer)的更多相关文章

  1. SQLite中不支持的sql语法

    今天很自然的在写Sql语句的时候用了Top,一开始没发现问题,因为我从数据库读出的值正好是0,而我习惯变量定义的时候也都赋值0,可是到我不要0的时候我就发现问题了.后来才知道,可爱的小sqlite竟然 ...

  2. SQL语法汇总

    以下默认为mySQL与SQLsever都能使用SQLsever不能使用的另外标出来了 显示数据库SHOW DATABASES;进入其中一个数据库USE students;显示进入数据库中的所有表SHO ...

  3. java核心技术第二篇之数据库SQL语法

    #查询products表记录SELECT * FROM products WHERE price > 2000;-- 单行注释/* 多行注释*/#创建数据库CREATE DATABASE hei ...

  4. [转]MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下.   DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...

  5. ORACLE分页查询SQL语法——最高效的分页

    --1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT  ...

  6. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  7. SQLite的 SQL语法总结

    SQLite库可以解析大部分标准SQL语言.但它也省去了一些特性并且加入了一些自己的新特性.这篇文档就是试图描述那些SQLite支持/不支持的SQL语法的.查看关键字列表. 如下语法表格中,纯文本用蓝 ...

  8. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  9. 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结

    PL/SQL语法 PL/SQL程序由三部分组成,声明部分.执行部分.异常处理部分. 模板: DECLARE /*变量声明*/ BEGIN /*程序主体*/ EXCEPTION /*异常处理部分*/ E ...

随机推荐

  1. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

    前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...

  2. boost bind使用指南

    bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板.用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看不 ...

  3. 配置alibaba的yum 源

    1, 进入yum源目录 cd /etc/yum.repos.d 2, 备份系统yum配置文件 sudo mv CentOS-Base.repo CentOS-Base.repo.bak 3, 下载al ...

  4. SpringMVC源码阅读:视图解析器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  5. 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建

    1. 在gitlab上配置192.168.1.30的ssh秘钥,使jenkins可以操作gitlab上的project 进入gitlab,点击右上角 点击 Settings -> SSH key ...

  6. 网络爬虫(一):配置selenium、pycharm(windows平台)

    最近在学习爬虫的编写,使用selenium模块时候,遇到了很多坑,本blog的目的是总结一下遇到的坑和解决办法,以便后来人少走弯路! 以下介绍均以Python3.x为基准进行,基于windows平台的 ...

  7. 浅谈JS中的!=、== 、!==、===的用法和区别

    var num = 1;     var str = '1';     var test = 1;     test == num  //true 相同类型 相同值     test === num ...

  8. C# 数组中的 indexOf 方法

    var array=['REG','2018','2018']; array.indexOf(‘REG’) // 0 array.indexOf(‘R’) // -1 array.indexOf(’2 ...

  9. 使用C#利用cmd来调用java jar包获取其中的数据

    其实也很简单,就是在C#中构建一个Process,启动jar包,并且给jar包传递参数 因为我并没有怎么学过JAVA,所以只写了个很小的Demo,就是根据传入的参数获取对应的数据 以下是JAVA De ...

  10. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题

    C#的编译器总是将匿名类型编译成internal的,当在视图中直接使用控制器传递的匿名对象时就会报错错误代码:控制器代码视图代码执行结果: ****************************** ...