关键词:动态SQL

1.流程控制

在T-SQL中,与流程控制语句相关的关键字有8个:

BEGIN...END

BREAK

GOTO

CONTINUE

IF...ELSE

WHILE

RETURN

WAITFOR

其实还可以加一个,那就是GO,下面我们一个一个来解释说明意思吧

  (1)GO:批处理提交语句,相当于把GO之前的所有东西都提交给系统了(平常看好像不用它也没事,但是在sqlcmd登录后dos界面使用批处理就一定要用),该销毁的销毁该回收的回收等等,演示如图

    

  GO后面还可以加数字,会重复执行。如图:

    

  (2)BEGIN ... END

    这个其实就是逻辑块,类似于各大语言的{}

  (3)while/break/continue

   

      while (表达式) --如果表达式成立则运行begin end中的statement语句,否则略过
    begin
      statement;
    end     break:直接跳出循环
    continue:本次循环后续代码不执行了,直接开始下一次循环
    太简单,就不演示了

  (4)IF ... ELSE

    IF (表达式) --如果表达式成立就执行BEGIN END中间的statement句子;
BEGIN
statement;
END
ELSE --如果IF中的表达式不成立则跳到ELSE中来,执行statement1;
BEGIN
statement1;
END --注意:如果不写BEGIN END那么默认只有一条语句属于IF/ELSE

  (5)goto

    goto是个捣乱的家伙,可以随意跳到任意一个定义点,基本没什么用,一般用来跳到错误

    

--实现循环功能的goto 跳转
基本用法:
定义点名称:
goto 定义点名称
案例:
  declare @n int
  set @n=1
  print_point:print @n
  IF (@n < 3)
  begin
  set @n=@n+1
  goto print_point
  end   print 'the @n alread > 3'

  结果如图:

    

  (6)return

      迅速结束任何一个批处理(batch),并且return后面的语句不会再执行了,演示如下

    ,发现print 5也没有执行为什么呢。记住了,批处理是以GO为结束

  (7)waitfor  

     延迟与定点

     (7.1)waitfor delay time  延迟 time(默认为秒)后继续顺序执行

        (7.2)waitfor time  time  定点到time的时候再顺序执行

      演示如下

  print 1
waitfor delay '00:00:05' --注意时间格式的写法
print 2

  print 1
  waitfor time '16:02:05'  --注意时间格式的写法
  print 2

 

2.动态SQL(其他类型必须转换成字符类型才能使用动态sql)

  (1)变量定义

    declare @n int

    分析:declare: 为关键字;  @n:@为变量标识,n变量名 ;int为变量类型;

    set @n = 1 ; select @n=1

    分析:set为赋值关键字,用select 也可以赋值

    使用的话,直接用@n即可

  (2)执行动态sql

    (2.1)execute,可以简写为exec

        基本形式:exec sp   或 exec(字符串),演示如下

        

  动态sql的基本演示   

        declare @sql varchar(1000),@t int
declare @n int
set @n=2
set @t=10
set @sql = 'select '+cast(@n as varchar)+' where 10 = '+cast(@t as varchar) --注意,这里其他类型必须转换成字符类型才能使用动态sql
execute(@sql)--可以简写为exec

  代码结果如下

      

  execute的连接到另一个服务器操作

    

  这就表示在链接服务器上做操作了。

  (2.2)sp_executesql 其实是一个存储过程

    要用exec去执行它,常用形式为: exec sp_executesql  @sql ,但@sql比较为UniCode形式,演示如下

    (不知道什么是Unicode的请看https://www.cnblogs.com/gered/p/9117522.html 中第5点中的字符串类型,常量字符串在前面加个N即可,如图)

      

    sp_executesql  可以在动态SQL中做参数输入输出操作

    【1】输入

declare @sql nvarchar(1000),@num int
set @sql = N'select @num=1'
exec sp_executesql @sql,N'@num int output',@num output --必须要在这里还要定义一次
print @num 结果:1

    【2】输入输出结合

declare @sql nvarchar(1000),@num int
set @sql = N'select @num=1 where @num2 = 10'
exec sp_executesql @sql,N'@num int output,@num2 int',@num output,@num2=10 --如果多个参数,一一对应即可
print @num 结果:1

declare @sql nvarchar(1000);
declare @num1 int;
declare @v_id int = 2 ;
declare @table_name nvarchar(100)=N'test..test4';
set @sql = N'select @num=id from '+@table_name+N' where id=@id ';
print @v_id
exec sp_executesql @sql,N'@num int output,@id int ',@num1 output,@id=@v_id--必须要在这里还要定义一次;
print @sql
print @num1

结果:

2
select @num=id from test..test4 where id=@id
2

 

    

判断execute与sp_executesql的好坏与区别

  行为相同:使用的语句或批处理在执行时才编译,编译后的内容作为执行计划运行

  不同行为:execute必须要把所有东西转成字符串,sp_executesql可以入参出参。

  注意事项:

    (1)数据类型转换问题,在execute中必须转换成字符型,在sp_executesql中必须使用UniCode格式

    (2)字符串边界问题:其实也就是单引号'  问题

  举个例子,比如正常情况下

declare @str char(6)
set @str = 'a'
select 1 where @str = 'a'

  换成动态sql的时候

declare @str char(6),@sql varchar(1000)
set @str = 'a'
set @sql = 'select 1 where '''+@str+'''=''a'''
exec(@sql)
--单引号在使用其本身的时候要转移,即 ''表示为' 再举个日期的例子,直接用要报错

  

正确代码如下:

  

 --想执行的语句 select 1 where getdate() > '20180601'
  declare @str datetime,@sql varchar(1000)
  set @str = '20180601'
 --动态sql语句
  set @sql = 'select 1 where getdate() > '''+@str+''''
  exec(@sql)


  (3)表变量表字段问题

--想要查询test101表中的所有内容
declare @table_name char(30)
set @table_name = 'test101'
select * from @table_name 这样报错
--想要查询test101表中的所有内容

  declare @table_name Nchar(30)
  set @table_name = N'test101'
  exec sp_executesql N'select * from @table_name',N'@table_name char(30)',@table_name

  这样也报错

    

  正确的打开方式如下:

    

  declare @table_name Nchar(30),@sql nvarchar(100)
  set @table_name = N'test101'
  set @sql = 'select * from '+@table_name
  exec (@sql)

   

 

  (4) 不能再动态sql中用exec 给变量赋值,可以用sp_executesql来赋值

  

(2.3)DDL增强功能-流程化控制与动态sql的更多相关文章

  1. (2.2)DDL增强功能-自定义函数与存储过程

    1.存储过程 精华总结: 通过对比@@ERROR一般和if判断结合使用,@@TRANCOUNT和try catch块结合使用,xact_abort为on可以单独使用Xact_abort为off时,如果 ...

  2. (2.5)DDL增强功能-触发器trigger

    SQL Server:触发器详解   1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. ...

  3. (2.1)DDL增强功能-数据类型、同义词、分区表

    1.数据类型 (1)常用数据类型 1.整数类型 int 存储范围是-2,147,483,648到2,147,483,647之间的整数,主键列常设置此类型. (每个数值占用 4字节) smallint ...

  4. (2.4)DDL增强功能-数据汇总grouping、rollup、cube

    参考:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 1.rollup (1)rollup在group by 子句中使用 ...

  5. xss利用——BeEF#stage2(初始并持续化控制)

    全文概览 浏览器攻击方法流程 攻击浏览器一般分为几个阶段,如下图 整个过程分为三个步骤,第一步是初始化控制,第二步是持续控制,第三步是攻击.在第三步中的七个攻击方法是可以交叉的,比如可以同时攻击用户和 ...

  6. 在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便。通过安装VirtualBox提供的“增强功能组件”,-摘自网络

    在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便.通过安装VirtualBox提供的“增强功能组件”,可以解决这一问题,并且使用非常方便. 一.环境 | En ...

  7. 12c分区增强功能,新功能(文档ID 1568010.1)

    12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterpr ...

  8. virtualbox安装增强功能时【未能加载虚拟光盘】

    virtualbox安装增强功能时[未能加载虚拟光盘] 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestA ...

  9. virtualbox安装增强功能(centos6.5)

    vitualbox安装增强功能(centos 6.5) 1. 安装依赖包 #yum install kernel-headers-$(uname -r) #yum install kernel-dev ...

随机推荐

  1. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size

    回到问题“为何会内存溢出?”. 要回答这个问题又要引出另外一个话题,既什么样的对象GC才会回收? 一.对象存活方式判断方法 在上一篇文章<GC之一--GC 的算法分析.垃圾收集器.内存分配策略介 ...

  2. MathType公式编辑器快捷键操作

    快捷键操作是最常见的操作方式,MathType软件系统提供大量的快捷键操作供用户使用.使用MathType公式编辑器快捷键操作可节省大量的操作的时间,本教程将详解MathType快捷键操作. 放大或缩 ...

  3. 搭建LNMP+CI环境

    首先搭建 LNMP 的服务器环境 安装 Nginx, MySQL 和 PHP 软件包,执行以下命令 yum install -y nginx mariadb-server mariadb php ph ...

  4. mysql中什么是逻辑备份

    需求描述: mysql中,或者说关系型数据库中逻辑备份到底指的是什么呢,主要还是对于 概念的理解,在此记录下. 概念解释: 逻辑备份:主要指的是保存数据库的逻辑结构(比如:create dattaba ...

  5. 使用 C# 开发智能手机软件:推箱子(二)

    在上篇文章"使用 C# 开发智能手机软件:推箱子(一)"中.我对推箱子程序作了整体介绍.这次,我先介绍 Common/Fcl.cs 源程序文件.  1 using System; ...

  6. Access数据操作-02

    数据库连接 MDB文件 :Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb ;Persist Security Info=False; AccDB文 ...

  7. cocos2d-x游戏引擎核心之一——坐标系

    cocos2d-x:OpenGL坐标系.绝对坐标系.相对坐标系.屏幕坐标系 cocos2d-x采用的是笛卡尔平面坐标系,也就是平面上两条垂直线构成的坐标系,平面上任意一点都可以用(x,y)来表示. ( ...

  8. 《C++ Primer Plus》12.7 队列模拟 学习笔记

    Heather银行打算在Food Heap超市开设一个自动柜员机(ATM).Food Heap超市的管理者担心排队使用ATM的人流会干扰超市的交通,希望限制排队等待的人数.Heather银行希望对顾客 ...

  9. Spring学习笔记--通过构造方法创建Bean

    如果一个bean没有默认的构造函数,那么可以通过工厂方法来构造一个bean.Spring通过<bean>元素的factory-method属性来装配工厂创建的Bean.下面例子中的Stag ...

  10. Android 使用DatePicker以及TimePicker显示当前日期和时间

    课程内容1.介绍DatePicker和TimePicker两种实现动态输入日期和事件的功能2.介绍DatePickerDialog和TimePickerDialog来年耕种实现动态输入日期和事件的对话 ...