zoukankan      html  css  js  c++  java
  • SQL Server 2008 之 values、Top、Merge、WaitFor

    参考:邀月系列 SQL Server 2008中的一些特性总结及BI学习笔记系列

    一、Values

    1.多行插入

      建测试表

    create table ValuesTest
    (
    Id int,
    Name varchar(20),
    Age int
    )
    go

    insert into ValuesTest

    --(Id,Name,Age)    全部列 可不写
    values
    (1,'张三',20),
    (2,'李四',30),
    (3,'王五',40)

    2.临时结果集

    select * from
    (Values
    (1,'张三',20),
    (2,'李四',30),
    (3,'王五',40)
    )
    x(id,name,age)

    二、Top

    1.Top通常用法

    例:

    select top 2 * from ValuesTest order by id

    2.参数化top 数量

    例:

    declare @tNum int=2
    declare @tSql varchar(200)
    set @tSql='select top '+CONVERT(varchar,@tNum)+' * from ValuesTest order by id'
    exec(@tSql)

    注意:直接执行  exec('select top '+CONVERT(varchar,@tNum)+' * from ValuesTest order by id') 是不可以,函数不可以嵌套(提示:关键字 'CONVERT' 附近有语法错误。)

    另外:

    set rowcount 2
    select * from ValuesTest
    order by id

    可以有相同的效果(据说top 和 rowcount在有索引的情况下,性能差不多,在无序的情况下,top性能比rowcount好,不过本人未测试)

    2.删除

    delete top(10) from ValuesTest  --注:10必须用括号,此处top相当于函数,10是参数

    3.更新

    update top(10) ValuesTest  set age=50

    update top(10) a set a.age=50 from ValuesTest a

    三、Merge 

    1.同时执行增、删、改

    新增一个对比表

    create table ValuesTest_compare
    (Id int,Name varchar(20),Age int)
    go

    插入数据

    insert into ValuesTest_compare values
    (1,'张三',20),
    (2,'李四',80),
    (4,'马六',80)

    现在看一下两个表的数据

    select * from ValuesTest

    Id Name Age
    1 张三 20
    2 李四 30
    3 王五 40

    select * from ValuesTest_compare

    Id Name Age
    1 张三 20
    2 李四 80
    4 马六 80

    ValuesTest与ValuesTest_compare都是3条记录,但是第一、二条记录的Age和ValuesTest_compare不周,第三条记录ValuesTest_compare没有,ValuesTest_compare的第三记录ValuesTest也没有

    下面执行

    --确定要修改的目标表
    Merge Into ValuesTest_compare a
    --从数据源查找 并关联(id关联)
    using ValuesTest b on a.id=b.id
    --如果id相同,则更新目标表
    When Matched and a.Name<>b.Name or a.Age<>b.Age Then Update set a.Name=b.Name,a.Age=b.Age
    --也可以直接用 When Matched Then Update set a.Name=b.Name,a.Age=b.Age
    --如果目标表中不存在,则从数据源插入目标表
    When Not Matched By Target Then Insert (id,name,age) values (b.id,b.name,b.age)
    --如果目标表的记录在源表中不存在,则删除目标表记录
    When Not Matched By Source Then Delete;

    (注意:Merge必须以";"结束,否则会有提示  MERGE 语句必须以分号(;)结尾)

    结果

    (3 行受影响)

    ValuesTest_compare表现在数据和ValuesTest相同

    2.输出修的改记录

    truncate table ValuesTest_compare

    insert into ValuesTest_compare
    values
    (1,'张三',20),
    (2,'李四',80),
    (4,'马六',80)

    建一个表存放结果

    create table ValuesTest_output
    (Id int,Name varchar(20),Age int)
    go

    Merge Into ValuesTest_compare a
    using ValuesTest b on a.id=b.id
    When Matched Then Update set a.Name=b.Name,a.Age=b.Age
    When Not Matched By Target Then Insert (id,name,age) values (b.id,b.name,b.age)
    When Not Matched By Source Then Delete output deleted.* into ValuesTest_output;
    select @@ROWCOUNT as Count1,ROWCOUNT_BIG() as Count2
    select * from ValuesTest_output;

    结果:

    Count1 Count2
    4 4

    Id Name Age
    NULL NULL NULL
    1 张三 20
    2 李四 80
    4 马六 80

    如果 使用 When Matched and a.Name<>b.Name or a.Age<>b.Age Then Update set a.Name=b.Name,a.Age=b.Age,则只有2条记录,因为两个表第一条记录相同

    四、WaitFor

    1.WaitFor TIME 'time_to_execute' 

      time_to_execute为时间格式(HH:mm:ss),指到该时间点执行

    例:

    print convert(varchar(20),getdate(),120)
    waitfor time '11:27:30'
    print convert(varchar(20),getdate(),120)

    结果:

    2013-12-11 11:26:58
    2013-12-11 11:27:30

    注意: time_to_execute 不能指定日期,格式只能是时间格式。

    2. WaitFor DELAY 'time_to_pass' 

    time_to_pass 为等待时长,格式:HH:mm:ss

    例:

    print convert(varchar(20),getdate(),120)
    waitfor delay '00:00:10'
    print convert(varchar(20),getdate(),120)

    结果:

    2013-12-11 11:35:18
    2013-12-11 11:35:28

    注意:执行delay 最长不超过24小时,同time_to_execute一样,time_to_pass不能有日期,只能是时间格式。

  • 相关阅读:
    react脚手架
    快速创建一个node后台管理系统
    vue脚手架结构及vue-router路由配置
    Spring 事务管理-只记录xml部分
    Spring-aspectJ
    Maven 自定义Maven插件
    JVM
    JVM
    Spring
    Digester
  • 原文地址:https://www.cnblogs.com/biyyss_sun/p/3467387.html
Copyright © 2011-2022 走看看