存储过程定位到正在执行的语句_按位置传递执行存储过程

hacker|
104

文章导读:

如何查看存储过程运行到哪个语句了

存储过程(procedure 过程)

SQL Server2005 的存储过程包含一些 T-SQL 语句并以特定的名称存储在数据中(存储过程也是一种数据库对象)可以在存储过程中声明变量,有条件的执行及其他各项强大的程序设计功能

SQL Server2005 的存储过程与其它育种设计语言的过程类似,同样按以下方式运行:

(1)它能够包含执行各种数据库操作的语句,并且可以调用其他的存储过程;

(2)能够接受输入参数,并以输出参数的形式将多个数据值返回给调用程序(Calling Procedure)或批处理(Batch);

(3)向调用程序或批处理返回一个状态值,以表明成功或失败(以及失败的原因);

(4)存储过程(Stored Procedures) 是一组为完成特定功能的SQL 语句集,经编译后,存储在数据库中,用户通过指定存储过程的名字给出参

数(如果该存储过程带有参数)来执行它;

存储过程的类型:

一、(系统存储过程):存储过程在运行时生成执行方式,其后在运行时执行速度很

SQL Server2005 不仅提供用户自定义存储过程的功能,而且也提供许多可作为工具使用的系统存储过程;

系统存储过程(Systerm StroedProcedures) 主要存储在master数据库中,并以 sp_ 为前辍,并且系统存储过程主要是从系统表中获取信息,从而为管理员SQL Server2005提供支持。通过系统存储过程SQL Server2005中的许多管理性或信息性的活动(如了解数据对象,数据库信息等)都可以被有效地完成,尽管这些系统存储过程被存储在master数据库中,但是仍然可以在其他 数据库中对其进行调用,在调用时,不必在存储过程前面加上数据库名,而且当创建一个数据库时,一些存储过程会在新的数据库中被自动创建;

系统存储过程所能完成操作很多,如提供帮助的存储过程

sp_helpsql 显示关于SQL语句,存储过程和其他主题的信息

sp_help 提供关于存储过程或其他数据库对象的报告

sp_helptext 显示存储过程和其他对象文本

sp_depends 列举引用或依赖指定对象的所有存储过程

sp_talbes 取得数据库中关于表和视图的相关信息,

sp_renameedb 更改数据库的名称

SQL Server2005系统存储过程可以使用户很容易地从系统表中提取信息,管理数据库,并执行涉及更新系统表的其他任务

系统存储过程中在master数据库中创建,由系统管理员管理,所有系统存储过程的名字均以sp_开始

如果过程以sp_前缀命名的过程在当前数据库中找不到,SQL Server2005就在master数据库中寻找,以sp_前缀命名的过程中引用的表如果不能在当前数据库中解析出来,将在master数据库查找

当前系统存储过程的参数是保留字或对象名,且对象名由数据库或拥有者名字限定时,整个名字必须包含在单引号中,一个用户可以在所有数据库中执行一个系统存储过程的许可权,否则在任何数据库中都不能执行系统存储过程

二、(本地存储过程)

本地存储过程(Local Stored Procedures)也就是用户自行创建并存储在用户数据库中的存储过程,一般所说的存储过程就是指的是本地的

用户创建的存储过程是由用户创建并能完成某一特定功能(如:查询用户所需要的数据信息)的存储过程

三、(临时存储过程)

临时存储过程(Temporary StoredProcedures)可分为以下两种

1)本地临时存储过程

不论哪一个数据库是当前数据库,如果在创建存储过程时,以井字号 (#) 作为其名称的,第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存放存储过程(如:CREATE PROCEDURE #book_proc) 本地临时存储过程只有创建它的连接的用户才能够执行它,而且一但这位用户断开与 sql-server的连接(也就是注销sql-server2005)本地临时存储过程就会自动删除,当然,这位用户也可以连接期间用 DROP PROCEDURE 命令删除他所创建的本地临时存储过程;

由于本地存储过程的适用范围仅限于创建它的连接,因此,不需担心其名称会和其他连接所采用的名称相同

2)全临时存储过程

不论哪一个数据库当前数据库,只要所创建的存储过程名称是以两个井字号(##)开始,则该存储过程将成为一个存储在tempdb 数据库中的全局临时存储过程(例如:create procedure ##book_proc) 全局临时存储过程一旦创建,以后连接到 SQL Server2005 的任意用户都能执行它,而且不需要特定的权限

当创建全局临时存储过程的用户断开与SQL Server2005的连接时,SQL Server2005将检查是否有其他用户在执行该全局临时存储过程,如果没有,便立刻将全局临时存储过程删除,如果有SQL Server2005会让这些正在执行中的操作继续进行,但是不允许任何用户再执行全局临时存储过程,等到有未完成的操作执行完毕后,全局临时存储过程就会自动删除;

由于全局临时存储过程能够被所有的连接用户使用,因些必须注意其名称不能和其他连接所采用的名称相同

不论创建的是本地临时存储过程还是全局临时存储过程,只要SQL Server2005一停止运行,它们将不复存在;

四(远程存储过程)

在SQL Server2005 中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和 excute 命令执行一个远程存储过程;

五(扩展存储过程)

扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,通过扩展存储过程可以弥补SQL Server2005的不足,它在使用和执行上与一般的存储过程完全相同;可以将参数传递给扩展存储过程,扩展存储过程也能够返回结果和状态值;

为了区别扩展存储过程的名称通常以xp_开头,扩展存储过程是以动态链接库(DLLS)的形式存在,能让SQL Server2005动态地装载和执行,扩展存储过程一定要存储在系统数据库 master 中

存储过程的优点

(1) 通过本地存储、代码预编译和缓存技术实现高性能的数据操作

(2) 通过用编程结构和过程实现编程框架;如果业务规则发生变化,可以通过修改存储过程来适应新的业务规则,而不必修改客户端的应用程 序,这样所有调用该存储过程的应用程序就会遵循新的业务规则;

(3) 通过隔离和加密的方法提高数据库的安全性。数据库可以通过得到权限来执行存储过程,而不必给予用户直接访问数据库对象的权限,这 些对象交收存储过程来执行操作,另外,存储过程可以加密,这样用户就无法阅读存储过程中的T-sql语句。这样做将数据库的结构和数 据库用户隔离开来,时一步保证数据的完整性和可靠性;

存储过程与视图的比较

(1) 可以在单个存储过程执行一系列T-SQL 语句,而在视图中只能是 select 语句

(2) 视图不能接受参数,只能返回结果集;而存储过程可以接受参数,包括输入,输出参数,并能返回单个或多个结果集以及返回值,这样可 大大地提高应用的灵活性;

一般来说,人们将经常用到的多个表的连接查询定义为视图,而存储过程完成复杂的一第列的处理,在存储过程中也会经常用到视图;

创建存储过程

CREATE PROCEDURE procedure_name

[WITH ENCRYPTION]

[WITH RECOMPILE]

AS

Sql_statement

其中 with encryption 对存储过程进行加密; with recompile 对存储过程重新编译

例如:使用T-SQL 语句在book数据库中创建一个名为p_book1的存储过程 该存储过程返回book1表中所有出版社为"中国长安"的记录

USE book

GO

CREATE PROCEDURE p_book1

AS

SELECT * FROM book1 WHERE 出版社='中国长安'

执行存储过程

存储过程创建成功后,用户可以执行存储过程来检查存储过程的返回结果;基本语法如下:

exec procedure_name

例如:使用T-SQL语句执行上面创建的存储过程 运行命令如下:

USE book

GO

exec p_book1

在运行完毕后,在SQL-Server ManagementStudio 查询窗口中返回的结果

存储过程创建成功后可以在 SQL-Server ManagementStudio 窗口中下查看存储过程的属性

例如:在 SQL-Server ManagementStudio 窗口中查看存储过程 p_book1 的属性:

对象资源管理器- 展开book选项- 展开可编程性- 右击 p_book1选择修改命令 就可以修改存储过程命令属性

带参数的存储过程

由于视图没有提供参数,对于行的筛选取只能绑定在视图中定义,灵活性不大,而存储过程提供了参数,大大提高了系统开发的灵活性

向存储过程设定输入、输出参数主要目的是通过参数向存储过程输入和输出信息来扩展存储过程的功能,能过设定能数,可以多次使用同一存储过程并按要求查找所需要的结果;

1、带输入参数的存储过程

输入参数是指由调用程序向存储过程传递的参数,它们在创建存储过程语句中被定义,在执行存储过程中给出相应的变量值,为了定义输入参数存储过程,需要在 create procedure 语句中声明一个或多个变量作为参数;其语法格式如下:

CREATE PROCEDURE procedurd_name

@parameter_name datatype=[default]

[with encryption]

[with recompile]

AS

Sql_statement

其中各项参数如下

(1) @parameter_name: 存储过程的参数名称,必须以符号@为前缀

(2) Datatype: 参数的数据类型

(3) Default: 参数的默认值,如果执行存储过程时未提供该参数的变量值,则使用default值

例子:使用T-SQL语句在book数据表中创建一个名为p_book1p的存储过程,该存储过程能根据给定的出版社回该出版社代码对应的book1表中的的记录:

分析:直接把上面的例子最后面的SQL语句 select * from book1 where 出版社='中国长安' 将里面的 “出版社='中国长安'”用变理代替为 select * from book1 where 出版社= @出版社 其中变量名 @出版社取了代值 '中国长安';由于使用了变量,所以需要定义该变量,我们把“出版社”的长度设为是20位字符串;所以在 AS 之前定义变更@出版社 varchar(20);

create procedure p_book1p

@出版社 varchar(20)

AS

SELECT * FROM book1 WHERE 出版社=@出版社

执行含有输入参数的存储过程

1)使用参数名传递参数值

在执行存储过程的语句中通过语句 @paramter_name=value 给出参数的传递值,当存储过程含有多个参数时,参数值可以任意顺序设定,对于允许空值和具有默认值的输入参数可以不给出参数的传递值;其格式语法如下:

exec procedure_name

[@paramenter_name=value]

[,....n]

例子:用参数名传递参数值的方法执行存储过程p_book1p,分别查出出版社为'中国长安'和"安徽人民"书的记录

exec p_book1p @出版社='中国长安'

go

exec p_book1p @出版社='安徽人民'

go

2) 按位置传递参数值

在执行存储过程的语句中,不通过参数传递值面直接给出参数的传递值,当存储过程含有多个输入参数时,传递值的顺序必须与存储过程中定义的输入参数顺序相一致,按位置传递参数时,也可以忽略空值和具有默认值的参数,但不能因此破坏输入参数的设定顺序;比如:在一个含有4个参数的存储过程中,用户可以忽略第3和第四个参数,但无法在忽略第3个的情况下而指定第4个参数的输入值;

语法格式如下:

exec procedure_name

[value1,value2,....]

例子:用按位置传递参数值的方法执行存储过程 p_book1p 分别查找出版社为“中国人口”和“内蒙人民”书的记录

exec p_book1p '内蒙人民'

go

exec p_book1p '中国人口'

go

按位置传递参数值比按参数名传递参数值更简捷比较适合参数值较少的情况,而按照参数名传递的方法使程序的可读性增强,特别是参数数量较多时,建议用按参数名传递参数的方法,这样的程序可读性/可维护性都要好一些;

3) 带输出参数的存储过程

如果需要从存储过程中返回一个或多个值,可以通过在创建存储过程的语句中定义输出参数来实现,为了使用输出参数,需要在

create procedure 语句中指定 output 关键字 输出语法如下: @parameter_name datatype=[defautl] OUTPUT

例如:创建存储过程 p_book1Num 要求能根据用户给定的出版社,统计该出版社的出书数量,并将数量以输入变量的形式返回给用户:

CREATE PROCEDURE p_bookNum

@出版社 var(20),@bookNum smallint output

AS

SET @BOOK1Num= --(这个里面是给book1Num 赋值)

(

select count(*) from book1

where 出版社=@出版社

)

ptrint @book1Num

执行存储过程p_book1Num

由于在存储过程 p_book1Num 中使用了参数@出版社和@book1Num 所以在测试时需要先定义相应的变量,对于输入参数@出版社需要赋值,而输出参数 @book1Num 无需赋值,它是从存储过程中获得返回值供用户进一步使用的

declare @出版社 varchar(20), @book1Num SMALLINT

set @出版社=“中国长安”

exec p_book1Num @出版社,@book1Num

说明:这里在是sql server2005 环境下进行测试的,而在进行系统开发时,往往变量的定义,赋值,使用都是在应用程序中设计的,存储过程 p_book1Num 的 print @book1Num语句也是为了在 SQL Server2005环境中测试而设计的

删除、修改、重命名存储过程

修改存储过程:是由alert 语句来完成的,语法如下:

ALTER procedure procedure_name

[with encryption]

[with recompile]

as

Sql_statement

例子:使用T-SQL语句修改存储过程 p_book1p 根据用户提供的出版社名称进行模糊查询并要求加密:

alter procedure p_book1p

@出版社 varchar(20)

with encryption

as

select 出版社,ISBN号,定价,作者姓名

from book1,teacher

where book1.编号=teacher.编号 and 出版社 like '%@出版社%'

存储过程的删除:存储过程的删除是通过DROP语句来实现的

例如:使用T-SQL语句来删除存储过程p_book1

use book

go

drop procedure p_book1

使用SQL-Server Management Studio窗口删除存储过程 p_book1p:

对象资源管理器- 展开BOOK- 展开可编程性- 右键dbo.p_book1p-删除 就可以了

存储过程重命名:

对象资源管理器- 展开BOOK- 展开可编程性- 右键dbo.p_book1p-重命名

存储过程的重编译处理

在存储过程中所用的查询只在编译时进行优化,对数据库进行索引或其他会影响数据库统计的更改后,可能降低已编译的存储过程的效率,通过对存储过程进行重新编译,可以重新优化查询;

在SQL-Server2005 中有三种方法重新编译的方法:

1) 在创建存储过程时使用 with recompile 子句

with recompile 子句可以指示 sql server2005 不将该存储过程的查询计划保存在缓存中,而是在每次运行时重新编译和优化,并创建新 的查询计划;下面是例子:

use book

go

create procedure p_book1p

@出版社 varchar(20)

with recompile

as

select * from book1 where 出版社=@出版社

这种方法并不常用,因为在每次执行存储过程时都要重新编译,在整体上降低了存储过程的执行速度,除非存储过程本身是一个比较复杂,耗时的操作,编译的时间相对于执行存储过程时间少;

2) 在执行存储过程时设定重新编译选项

通过在执行存储过程时设定重新编译,可以让SQL-Server2005在执行存储过程时重新编译该存储过程,在这一次执行后,新的查询计划又被保存在缓存中;基语法格式是:

execute procedure_name with recompile

以重新编译的方式执行存储过程p_book1p:

use book

go

execute p_book1p '中国长安'with recompile 此方法一般在存储过程创建后,数据发生了显著变化时使用

3) 通过系统存储过程设定重新编译选择;其语法如下

exec sp_recomplie OBJECT 其中OBJECT 当前数据库中的存储过程,表或视图的名称

例子:执行下面的语句将导致book1表的触发器和存储过程在下次运行时将被重新编译:

exec sp_recompile book

===========================================================================================================================

触发器的创建和管理

概述:在SQL-Server2005数据库系统中,存储过程和触发器都是SQL语句和流程控制语句的集合

===========================================================================================================================

如何将存储过程放入查询语句中执行

存储过程无法跟select语句连接。

frogley说的建立临时表的方式基本是唯一办法,稍微变通一下即可。

建个用存储过程结果作为数据源的视图,然后select这个视图的语句跟你的固定语句union就行了。

如何判断SQLSERVER存储过程是否正在执行

select * from  master.dbo.sysprocesses

-- 列出 spid  50 的.

对每个 spid 用 dbcc inputbuffer(spid) 看执行的文本, 如果搜索完所有的 spid, 其执行的文本中都没有包括你的存储过程.

则基本上可判断出存储过程未执行.

怎么获取存储过程里正在执行的sql语句

用SQL Profiler可以跟踪正在执行的SQL,也可以保存下来,方便查错。

在MS SQL Server中怎么查看正在执行的SQL

有二种方式来查看正在执行的SQL语句

使用SQL自带的SQL Server Profiler,以可视化界面的方式来查看。

从开始=》所有程序=》Microsoft SQL Server 2008=》性能工具打开Profiler工具,也可以打开SQL Server Management Studio=》工具=》SQL Server Profiler。

然后选择文件=》新建=》跟踪打开一个连接窗口,选择将要跟踪的服务器实例然后连接,并打开“跟踪属性”对话框,点运行即可看到正在执行的SQL语句。

使用SQL语句来查看正在运行的语句,如下

SELECT  [Spid] = session_id ,

            ecid ,

            [Database] = DB_NAME(sp.dbid) ,

            [User] = nt_username ,

            [Status] = er.status ,

            [Wait] = wait_type ,

            [Individual Query] = SUBSTRING(qt.text,

                                           er.statement_start_offset / 2,

                                           ( CASE WHEN er.statement_end_offset = -1

                                                  THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))

                                                       * 2

                                                  ELSE er.statement_end_offset

                                             END - er.statement_start_offset )

                                           / 2) ,

            [Parent Query] = qt.text ,

            Program = program_name ,

            hostname ,

            nt_domain ,

            start_time

    FROM    sys.dm_exec_requests er

            INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid

            CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt

    WHERE   session_id 50 -- Ignore system spids.

            AND session_id NOT IN ( @@SPID ) -- Ignore this current statement.

ORDER BY    1 ,

            2

1条大神的评论

  • avatar
    访客 2022-08-11 上午 07:35:52

    urd_name@parameter_name datatype=[default][with encryption][with recompile]ASSql_statement其中各项参数如下(1) @parameter_name: 存储过程的参数名称,必须以符号@为前缀(2) Dataty

发表评论