最近写T-sql语句比较多, 想把这段时间遇到过的貌似有用的一些sql server的函数,存储过程,临时表等总结一下,以便不时之需,当然不会一下子所有都总结,但会分段总结;

1)存储过程定义:

create proc [proc_name]
@para_1 nvarchar(250),
@para_2 int=1,
@para_3 nchar(10) output
as

上面这段sequal就是创建一个名为proc_name的存储过程,她接受两个输入参数,分别为@para_1和有默认值为1的@para_2,且返回一个nchar类型的值;
@para_2 int=1, 指明了@para_2参数在调用该存储过程时可以不提供,系统会给个默认值为1;
@para_3 nchar(10) output, 说明@para_3是一个输出参数,存储过程可以指明多个输出参数,如还可以在后面加一个输出参数:@para_4 bit output,要在退出存储过程前给她赋值,如果不赋值她一直保持为null;
可以像下面那样去调用:

declare @arg_3 nchar(10)
exec proc proc_name 'staff_001',0,@arg_3 output-- 或者不指供有默认值的para_2, 如
declare @arg_3 nchar(10)
exec proc proc_name 'staff_001',@arg_3 output

2)临时表:

2种临时表,分别为:全局,局部
全局和局部和平时学的编程语言里的全局变量和局部变量语义是一样,只是意思上有点差别;
如全局临时表一旦创建了,她就像一个普通的表一样,只要创建她的那个连接未断开,当前任何的连接都可以访问该全局临时表,如果创建她的连接断开了,那么已经引用她的其它任务,可以继续引用她,但新的任务或连接不能再引用她,一旦没有任何任务引用她时,该临时表即被系统释放掉;
局部临时表只能在创建她的任务里引用, 比喻创建了一个连接,如平时那样连接上一个数据库,然后创建一个临时表,那么该临时表,可能被在该连接里的所有任务引用,但如果在该连接里的某个存储过程创建,则只在被该存储过程引用,其它存储过程或函数(这些统称为任务)都不能引用她;

创建全局临时表, 全局临时表都是以##开头的,这是sql server 内定的,不能改:

create table [##g_temp_name](staff_no nvarchar(250) primary key,staff_name nvarchar(250) null,state int default 0)
-- 或者
select * into [##g_temp_name] from real_table-- 或者
exec('select * into [##g_temp_name] from real_table')

上面3种试创建的全局临时表效果是一样的,只要连接未断开,都可以像访问普通表一样访问她:

select * from ##g_temp_name-- orexec('select * from ##g_temp_name')

创建局部临时表, 局部临时表都以单个#开头的,也是sql server 内定的:

create table [#temp_name](staff_no nvarchar(250) primary key,staff_name nvarchar(250) not null,state int default 0)-- 或者
select * into #temp_name from real_table-- 或者exec ('select * into #temp_name from real_table')

注意局部临时表只能在一个批处理里有效,如用第3种方式创建的局部临时表,是无法在这个批外面访问到的,所以用字符串拼接方式创建的临时表,意义不大,除非访问临时表也拼接到该字符串里去;
如果确实要用到拼接字符串也作查询数据的,这里有两个解决方案,一个是用全局临时表放到拼接字符串里,因为全局临时表一旦创建了,只要连接还没断开都可以随便访问的,如:

exec ('select field_1, field_2 into ##g_temp_name from real_table')
select * from ##g_temp_name

当然用全局临时表,有个缺点是当前的任务连接都可以访问到她,所以当出现并发访问时,就出问题了,可能会被另一个连接把她的数据修改了。下面有另一种解决方案可以完美的处理这种问题,就是用局部临时表,但局部临时表不写的拼接字符串去,而把拼接字符串查询语句返回的记录插入到局部临时表里, 这种方法屡试不爽:

create table #temp_name(staff_no nvarchar(250))insert into #temp_name exec('select field_1 from real_table')
-- 再扩展一下
select * into #temp_name_2 from real_table_2 A where A.field_1 in(select B.staff_no from #temp_name where B.staff_no <> '')
--
select * from #temp_name_2

在写存储过程时经常用到临时表,如果对一个临时表名只用一次,可以不手动删除它,在调用完存储过程系统自动会把它删除,但如果要多只用到,有时就要进行手动删除了,如果删除了一个不存在的临时表,系统会报错的,所以在手动删除前最好判断该临时表是否存在;
临时表都不保存在当前数据库的,而是在tempdb里,所以删除时要注意:

if object_id('tempdb..[#temp_name]') is not null
begindrop table [#temp_name]
end

3) 游标:
游标是很有用的工作,特别是用在逐行访问表里的记录时,就像C#里的foreach一样,对一个集合进行迭代访问,但游标却特耗资源,如能不用尽量不要用,只有在用其它方法无法做到,或做起来特麻烦时就要考虑用游标了; 创建一个游标:

declare [cursor_name] cursor from select staff_no, staff_name from real_table-- 声明两个用来存储no 和name的变量
declare @staff_no nvarchar(250), @staff_name nvarchar(250)-- 打开游标
open [cursor_name]-- 移动游标到第一行
fetch [cursor_name] into @staff_no, @staff_name-- 判断游标是否已迭代完@@fetch_status = 0说明还未完
while @@FETCH_STATUS = 0
begin-- Do something with @staff_no, @staff_name-- 继续移动游标到下一行fetch [cursor_name] into @staff_no, @staff_name
end-- 关闭游标
close [cursor_name]
-- 释放资源
deallote [cursor_name]

******说明: 方括号指的是要创建的对象名称:如[cursor_name]可以自定义名为my_cur_name,不要加方括号;还有游标的名字前不要加其它修饰符,如@my_cur_name或#my_cur_name, 单纯my_cur_name就可以了******

转载于:https://www.cnblogs.com/grissom007/archive/2012/11/07/2878327.html

常用的sql server 函数、存储过程、临时表总结相关推荐

  1. Sql Server函数和存储过程

    SQL Server函数是一种封装一条或多条SQL语句的结构. SQL Server函数分为系统函数和用户自定义函数两种. 标量值函数:标量值函数的返回值是基本数据类型的单个值或单个值得表达式. 函数 ...

  2. [翻译]使用C#创建SQL Server的存储过程(Visual Studio 2005 + SQL Server 2005)

    原文地址:http://www.dotnetbips.com/articles/70eff218-3da0-4f6f-8f8d-eeea65193f2c.aspx[原文×××] [翻译]使用C#创建S ...

  3. sql server 函数大全

    sql server使用convert来取得datetime日期数据 sql server使用convert来取得datetime日期数据,以下实例包含各种日期格式的转换 语句及查询结果: Selec ...

  4. Sql Server函数全解三数据类型转换函数和文本图像函数

    原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...

  5. 实验8 SQL Server 的存储过程

    实验8 SQL Server 的存储过程 一.实验目的 1.掌握使用T-SQL编程的方法 2.掌握使用T-SQL语句创建一个存储过程并验证 3.掌握创建和执行带参数的存储过程 4.熟练使用系统存储过程 ...

  6. SQL Server函数之空值处理

    SQL Server函数之空值处理 coalesce( expression [ ,...n ] )返回其参数中第一个非空表达式. Select coalesce(null,null,'1','2') ...

  7. 使用SpringBoot+MybatisPlus框架的后端项目调用SQL Server的存储过程时报错

    在使用SpringBoot+MybatisPlus框架的后端项目调用SQL Server的存储过程时报错: Mapper层xml中的代码为: 在命令行调用存储过程时,可以顺利执行,但是在mapper中 ...

  8. 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

    在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...

  9. SQL Server分页存储过程实践(图解)

    下面来对SQL Server分页存储过程进行一下实做.图解成功的各个步骤. 一 找到大数据量的示例表 分页都是针对大记录数的表:反之有大记录数的表,可能就需要分页.例如银行用户表,就会上千万.下面先做 ...

最新文章

  1. w3cschool教程 - jQuery插件总结
  2. 就差一点点-微妙的强制类型转换
  3. windows 2008R2 无法安装操作系统补丁,或无法安装Sp1升级包的解决办法
  4. 【php7扩展开发四】函数的参数 ,引用传参 ,返回值
  5. 过滤日志中不相关的堆栈跟踪行
  6. Linux Shell脚本专栏_一键查看服务器的利用率_04
  7. 什么是大数据,大数据到底应该如何学?
  8. 网页关键词监控采集器-编辑必备
  9. 实验十一 连接数据库实验(V2.0)
  10. linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
  11. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  12. SEO网站优化步骤超详细完整版教程
  13. 12,jesd204b实战操作笔记
  14. Lrc文件与音乐的同步显示
  15. 操作系统OS-采用分段式存储管理不会产生内部碎片
  16. 如何安装Chrome扩展程序或插件
  17. 6、域渗透中查询域用户对域成员机器关系
  18. 全球及中国HSK刀柄行业投资态势及前景建议研究报告2022版
  19. python爬虫 — 爬取豆瓣最受关注图书榜
  20. uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID

热门文章

  1. 介绍一下XMLHttpRequest对象,他有哪些常用方法和属性
  2. OGG重复记录导致复制进程挂起
  3. oracle constraint_type 问题
  4. ORACLE TEXT LEXER PREFERENCE(二)
  5. Linux文件句柄限制总结
  6. Tomcat可运行源码资源分享
  7. Spring Annotation(@Autowire、@Qualifier)
  8. 苹果树(线段树+Dfs序)
  9. 谈一下JavaScript的语法
  10. 自己编写jQuery插件之表单验证