T-SQL的存储过程
1.简介
存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。而且这个代码块是编译过了放在数据库端的,后台的代码比如php CI框架可以直接调用它:
<?php
$sql="exec prec_xxx";
$query = $this->db->query($sql);
?>
由于数据库是先编译后执行的,所以存储过程是一个编译过的代码块的话,执行效率要比在程序里用T-SQL语句高。
当然存储过程还有其他优点比如上面的例子只传送了13个字节,相比于打断的T-sql语句要节省带宽。
2.分类
存储过程包括系统存储过程和用户自定义的存储过程。
系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。例如下列表单中就包含一些系统存储过程,可以使用exec执行:
1. 查看数据库的版本
select @@version 2. 查看数据库所在机器操作系统参数
exec master..xp_msver 3. 查看数据库启动的参数
sp_configure 4. 查看数据库启动时间
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名
print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)
5. 查看所有数据库名称及大小
sp_helpdb 重命名数据库用的SQL
sp_renamedb 'old_dbname', 'new_dbname' 6. 查看所有数据库用户登录信息
sp_helplogins 查看所有数据库用户所属的角色信息
sp_helpsrvrolemember 修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程 更改某个数据对象的用户属主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner' 注意: 更改对象名的任一部分都可能破坏脚本和存储过程。 把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本 7. 查看链接服务器
sp_helplinkedsrvlogin 查看远端数据库用户登录信息
sp_helpremotelogin 8.查看某数据库下某个数据对象的大小
sp_spaceused @objname 还可以用sp_toptables过程看最大的N(默认为50)个表 查看某数据库下某个数据对象的索引信息
sp_helpindex @objname 还可以用SP_NChelpindex过程查看更详细的索引情况
SP_NChelpindex @objname clustered索引是把记录按物理顺序排列的,索引占的空间比较少。
对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。
查看某数据库下某个数据对象的的约束信息
sp_helpconstraint @objname 9.查看数据库里所有的存储过程和函数
use @database_name
sp_stored_procedures
查看存储过程和函数的源代码
sp_helptext '@procedure_name' 查看包含某个字符串@str的数据对象名称
select distinct object_name(id) from syscomments where text like '%@str%' 创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数 解密加密过的存储过程和函数可以用sp_decrypt过程 10.查看数据库里用户和进程的信息
sp_who
查看SQL Server数据库里的活动用户和进程的信息
sp_who 'active'
查看SQL Server数据库里的锁的情况
sp_lock
用户自定义存储过程,创建语法:
create proc | procedure pro_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
3.举例
下例为一个T-SQL存储过程(例如是prec_xxxx),用于将一系列表中的一些字段提取出来,返回给php程序。
as
BEGIN
declare @rluid uniqueidentifier
--创建临时表
IF OBJECT_ID('tempdb..#tab') IS NOT NULL
DROP TABLE #tab
select convert(varchar(50),rl_uid) rl_uid ,rl_name, convert(varchar(300),'') menunames,
convert(varchar(2000),'') usernames,isnull(ve.emp_name,cve.NAME)emp_name,convert(varchar(10),rl_updatedate,120) rl_updatedate
into #tab
from t_role tr
left join v_employee ve on ve.emp_ssn = tr.rl_createuser
left join ttm.dbo.chrm_view_employee cve on cve.EMPLOYEE_ID = tr.rl_createuser
--创建游标
declare rolelist cursor
for
select rl_uid
from t_role order by rl_updatedate desc
open rolelist
fetch next from rolelist into @rluid
while(@@fetch_status=0)
begin
--角色对应的菜单
declare @menunames varchar(300)
declare @muname varchar(50)
set @menunames = ''
declare menulist cursor
for
select tu.mu_name from t_role_menu tm
inner join t_menu tu on tm.mu_uid = tu.mu_uid
where tm.rl_uid = @rluid
open menulist
declare @i int
set @i = 0
fetch next from menulist into @muname
while(@@fetch_status=0)
begin
if @i=0
begin
set @menunames = @menunames+@muname
end
else
begin
set @menunames = @menunames+' , '+@muname
end
set @i = @i + 1
fetch next from menulist into @muname
end
close menulist
deallocate menulist
update #tab set menunames = @menunames where rl_uid = @rluid
--角色对应的用户
declare @usernames varchar(2000)
declare @username varchar(50)
set @usernames = ''
declare userlist cursor
for
select isnull(ve.emp_name,cve.name)emp_name from t_role_user tu
left join v_employee ve on tu.emp_ssn = ve.emp_ssn
left join ttm.dbo.chrm_view_employee cve on cve.EMPLOYEE_ID = tu.emp_ssn
where rl_uid = @rluid
open userlist
declare @j int
set @j = 0
fetch next from userlist into @username
while(@@fetch_status=0)
begin
if @j=0
begin
set @usernames = @usernames+@username
end
else
begin
set @usernames = @usernames+' , '+@username
end
set @j = @j + 1
fetch next from userlist into @username
end
close userlist
deallocate userlist
update #tab set usernames = @usernames where rl_uid = @rluid
fetch next from rolelist into @rluid
end
close rolelist
deallocate rolelist
select rl_uid,rl_name,menunames,convert(text,usernames)usernames,emp_name,rl_updatedate from #tab
END
上面的代码看完一定会对SQL之所以被称为语言表示强烈认可,各种变量呀,循环呀,很像其他编程语言的feel。当然有很多地方可能不够简洁,有人说是它是面向集合的语言。。。有意思。
T-SQL的存储过程的更多相关文章
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- 使用 ODBC .NET 提供程序和 Visual C# .NET 执行 SQL 参数化存储过程
http://support2.microsoft.com/kb/310130/zh-cn 此分步指导文章描述如何使用 ODBC .NET 托管提供程序和 Visual C# .Net 调用参数化 S ...
- SQL Server存储过程Return、output参数及使用技巧
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦
上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...
- SQL Server 存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- 14、SQL Server 存储过程
SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...
- Sql Service存储过程分页
一起是用oracle数据库..感觉oracle数据库强大.查询速度是杠杠的.换了家公司用的是SQL SERVICE.以前用了1年现在捡回以前的记忆.动手写了动态SQL过存储过程分页.感觉和oracle ...
- [转]关于SQL分页存储过程的分析
[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
随机推荐
- 七种可能 | Linux丢包故障的定位与解决
出处[云英公众号]:https://mp.weixin.qq.com/s?__biz=MzI1NzM3NTYxMw==&mid=2247483685&idx=1&sn=95c8 ...
- Windows 数据盘自动分区脚本
在CMD命令文本下执行,即可: diskpart //1.进入diskpart模式 list disk //2.查询磁盘 select disk 1 //3.选择磁盘 create partition ...
- C++ 智能指针(shared_ptr/weak_ptr)原理分析
其主要的类关系如下所示(省略相关的类模板参数): 图1 从上面的类图可以清楚的看出shared_ptr内部含有一个指向被管理对象(managed object)T的指针以及一个__shared_cou ...
- 【LeetCode】5083. Occurrences After Bigram 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字符串分割遍历 日期 题目地址:https://le ...
- 【LeetCode】28. Implement strStr() 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 find函数 遍历+切片 日期 题目地址:https ...
- C. Watching Fireworks is Fun(Codeforces 372C)
C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...
- CF 593B Anton and Lines(水题)
题意是给你n条直线,和x1,x2;问 在x1,x2之间(不包括在x1,x2上) 存不存在任意两条线的交点. 说思路,其实很简单,因为给的直线的条数很多,所以无法暴力求每两条直线的交点,那么就求每条直线 ...
- Netty 中的心跳机制
在TCP长连接或者WebSocket长连接中一般我们都会使用心跳机制–即发送特殊的数据包来通告对方自己的业务还没有办完,不要关闭链接. 网络的传输是不可靠的,当我们发起一个链接请求的过程之中会发生什么 ...
- Second Order Optimization for Adversarial Robustness and Interpretability
目录 概 主要内容 (4)式的求解 超参数 Tsiligkaridis T., Roberts J. Second Order Optimization for Adversarial Robustn ...
- Going Deeper with Convolutions (GoogLeNet)
目录 代码 Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]. computer vision and pattern ...