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的存储过程的更多相关文章

  1. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  2. 使用 ODBC .NET 提供程序和 Visual C# .NET 执行 SQL 参数化存储过程

    http://support2.microsoft.com/kb/310130/zh-cn 此分步指导文章描述如何使用 ODBC .NET 托管提供程序和 Visual C# .Net 调用参数化 S ...

  3. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  4. 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦

           上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...

  5. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  6. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  7. Sql Service存储过程分页

    一起是用oracle数据库..感觉oracle数据库强大.查询速度是杠杠的.换了家公司用的是SQL SERVICE.以前用了1年现在捡回以前的记忆.动手写了动态SQL过存储过程分页.感觉和oracle ...

  8. [转]关于SQL分页存储过程的分析

    [转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...

  9. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  10. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

随机推荐

  1. 云小课|DGC数据开发之基础入门篇

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...

  2. maven打包 运行出现 错误: 找不到或无法加载主类 jar

    使用maven进行打包成jar包后 使用java -jar运行jar包 出现 错误: 找不到或无法加载主类 jar 主要是由于依赖没下载好,重新下载依赖 以及要在项目的pom.xml里面添加 < ...

  3. Oracle根据约束条件名称查找对应的数据

    select * from dba_constraints where constraint_name = 'SYS_C0082752'

  4. 【LeetCode】697. Degree of an Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 求出最短相同子数组度的长度 使用堆求最大次数和最小长 ...

  5. 1742 开心的小Q

    如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...

  6. 人脸搜索项目开源了:人脸识别(M:N)-Java版

    ​ 一.人脸检测相关概念 人脸检测(Face Detection)是检测出图像中人脸所在位置的一项技术,是人脸智能分析应用的核心组成部分,也是最基础的部分.人脸检测方法现在多种多样,常用的技术或工具大 ...

  7. Intriguing Properties of Contrastive Losses

    目录 概 主要内容 广义对比损失 不同的先验 不同的权重比 Feature Suppression DigitOnImageNet dataset RandBit dataset 代码 [Chen T ...

  8. Xcode Error returned in reply: Connection invalid

    当电脑上有Xcode两个版本是使用其中的某一个的Simulator时出现了这样的报错 在Preference->Location->Command Line Tool 选择 Xcode 9 ...

  9. windows环境下node安装教程(超详细)

    安装node.js 1.下载node: 下载地址:http://nodejs.cn/download/ node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路ne ...

  10. Linux查找class类所在jar包

    1.说明 写代码或者定位问题的时候, 经常发生只知道类名不知道其所在jar包的问题, 在Eclipse中可以使用Ctrl+Shift+T查找类, 但是如果类所在的jar包不在Build Path中, ...