当前位置:首页 » 编程语言 » sql测试存储方法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql测试存储方法

发布时间: 2022-08-02 04:06:39

1. sql 存储过程建立和使用方法

Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。 存储过程相对于其他的数据库访问方法有以下的优点: (1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。 (2)提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。 (3)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。 (4)安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。 存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。 其中,用户定义的存储过程又分为Transaction-SQL和CLR两种类型。 Transaction-SQL 存储过程是指保存的Transaction-SQL语句集合,可以接受和返回用户提供的参数。 CLR存储过程是指对.Net Framework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。他们在.Net Framework程序集中是作为类的公共静态方法实现的。(本文就不作介绍了) 创建存储过程的语句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存储过程所属的架构的名称 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 执行:Exec AllGoods 发生错误。 执行:Exec yangyang8848.AllGoods 正确执行。 [;Number]: 用于对同名过程进行分组的可选整数。使用一个 DROP PROCEDURE 语句可将这些分组过程一起删除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 创建完毕了两个存储过程。它们在同一个组S1里,如果执行Exec S1 则存储过程默认执行 Exec S1 ;1 。如果我们想得到所有据点信息则需要执行Exec S1 ;2。当我们要删除存储过程的时候,只能执行Drop Exec S1 则该组内所有的存储过程被删除。 [@ parameter]: 存储过程中的参数,除非将参数定义的时候有默认值或者将参数设置为等于另一个参数,否则用户必须在调用存储过程的时候为参数赋值。 存储过程最多有2100个参数。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 调用的代码: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在参数的后边加入Output 表明该参数为输出参数。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 调用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存储过程的两个参数一个有默认值一个没有,那么我们要把有默认值得放在后边,不然会出问题哦~~ 细心的朋友,可能看到上边的语句有一些不同,比如,存储过程用的是output,而调用语句用的是out。我要告诉您,两者是一样的。 [RECOMPILE]:指示数据库引擎 不缓存该过程的计划,该过程在运行时编译。如果指定了 FOR REPLICATION,则不能使用此选项。对于 CLR 存储过程,不能指定 RECOMPILE。 这个说一个非常好用的函数 OBJECT_ID :返回架构范围内对象的数据库对象标识号。 例如:我们创建存储过程时,可以如下写代码 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 针对于上边的这个存储过程,我们调用以下SQL查询 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我们是可以查到结果的。 可是如果我们对该存储过程加入[ ENCRYPTION ] 那么你将无法看到任何结果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然后我们查询 sys.sql_moles 目录视图,将返回给你Null。</p> 然后我们执行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你将得到以下结果:The text for object 'yangyang8848.OneGoods' is encrypted. 说到这里你应该明白了,参数[ ENCRYPTION ]:是一种加密的功能, 将 CREATE PROCEDURE 语句的原始文本转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,可通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可使用此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索已解密的过程。 前两天写了一篇关于游标的介绍文章 ,下边写一个例子,将游标与存储过程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下边建立另外一个存储过程,用于遍历游标输出结果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最后执行Exec GetAllGoodsIDAndName结果为以下内容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014

2. sql server怎么调试存储过程

与其他编程语言中的调试一样,您可以在调试 Transact-SQL 脚本的同时查看和修改局部变量和参数、查看全局变量以及控制和管理断点。本示例说明如何通过单步执行创建和调试 Transact-SQL 存储过程。 警告: 以下过程将使用在连接的数据库开发和面向项目的脱机数据库开发这两节中的过程中创建的实体。 调试存储过程在“解决方案资源管理器”中,右键单击 TradeDev 项目,选择“添加”,然后选择“存储过程”。将这个新的存储过程命名为 AddProct,然后单击“添加”。将以下代码粘贴到该存储过程中。 CREATE PROCEDURE [dbo].[AddProct] @id int, @name nvarchar(128) AS INSERT INTO [dbo].[Proct] (Id, Name) VALUES (@id, @name) 按F5 生成和部署该项目。在SQL Server 对象资源管理器的“本地”节点下,右键单击 TradeDev 数据库,然后选择“新建查询”。将下面的代码粘贴到查询窗口中。 EXEC [dbo].[AddProct] 50, N'Contoso'; GO 单击左窗口边距以便向 EXEC 语句添加断点。按下Transact-SQL 编辑器工具栏中的绿色箭头按钮上的下拉箭头,然后选择“使用调试器执行”,以便使用调试执行查询。或者,也可以从SQL Server 对象资源管理器启动调试功能。右键单击 AddProct 存储过程(位于 Local -> TradeDev database -> Programmability -> Stored Proceres 下)。选择“调试过程...”。如果对象需要参数,则会出现“调试过程”对话框,显示一个包含各个参数行的表。表中的每一行都包含参数名称列和参数值列。输入各个参数的值,再单击“确定”。请确保“本地”窗口打开。如果未打开,则单击“调试”菜单,选择“窗口”和“本地”。按F11 键逐行执行该查询。请注意,存储过程参数和它们各自的值将显示在“本地”窗口中。或者,将鼠标指针悬停在 INSERT 子句中的 @name 参数上方,您将看到要传递给它的 Contoso 值。在文本框中单击 Contoso。键入 Fabrikam,然后按下 ENTER 以便在调试时更改 name 变量的值。还可以在“本地”窗口中更改其值。请注意,该参数的值现在显示为红色,表示它已经更改。按F10 键逐行执行其余代码。在SQL Server 对象资源管理器中,刷新 TradeDev 数据库节点以查看 Proct 表的数据视图中的新内容。在SQL Server 对象资源管理器中的“本地”节点下,找到 TradeDev 数据库的 Proct 表。右键单击 Proct 表,然后选择“查看数据”。请注意,新行已添加到该数据库中。

3. plsql存储过程怎么测试啊

执行一下,再用call 调用一下,如果有错会有提示的

4. plsql存储过程如何调试

1. 打开PL/SQL Developer如果 在机器上安装了PL/SQL Developer的话,打开PL/SQL Developer界面输入 用户名,密码和host名字,这个跟在程序中web.config中配置的完全相同,点击确定 找到 需要调试的存储过程所在的包(Package bodies),如PACK_ACTIVITY,点击右键,在弹出菜单中选择[查看],得到包中的所有存储过程和他们的代码.
2. 添加debug信息为了 能够单步跟踪存储过程,需要为其所在的包添加debug信息,右键点击需要调试的包,在弹出菜单中选中[添加调试信息](这个很重要).这样 就为包体添加了调试信息。
3. 调 试存储过程现在 所有的准备工作都做好了,可以调试跟踪存储过程了。选择 需要调试的存储过程,点击右键,在弹出菜单中 选择[测试],进去测试窗口.测试窗口中有为了测试该存储过程自动所产生的代码,当然你也可以自己另外加入和修改代码,对于我们目前只是为了调试存储过程, 自动生成的代码已经足够了。接着按照如下的步骤进行调试。
(1)添加存储过程所需要的参数,我们项目中的大多数存储过程都是需要参数 的,参数可以在测试窗口右下部分输入。如:GetPanNO_New需要一个输入参数v_employeeid,我们输入180,输出参数是mycursor,是查看结果的,不需要输入任何值。
(2)开始调试,点击[调试]菜单->[开始](或者按F9),就进去调试模式了,程序开始停在begin这一行.
(3)以后的调试过程跟我们熟悉的的调试过程就一样了:运行(Ctrl+R)单步 进入(Ctrl+N)单步 跳过(Ctrl+O)单步 退出(Ctrl+T)或者 点击debug工具条上的按扭:当按Ctrl+N进去存储过程的源代码中后 在这 个窗口中可以查看过程中的变量值和堆栈。
(4)调试运行完了后,可以查看结果如下(点击mycursor变量旁边的按钮).
4. Tip 令人 比较郁闷的是我们项目中很多的存储过程都是一个SELECT语句,不管这个SELECT语句多么复杂(SELECT语句中有嵌套的子SELECT语句),它也只能作为一行代码,单步跟踪就没有什么意义了。

5. mssql存储过程

MS
SQL基础教程:创建存储过程
在MS
SQL
Server
2000
中,创建一个存储过程有两种方法:一种是使用Transaction-SQL
命令Create
Procere,
另一种是使用图形化管理工具Enterprise
Manager。
用Transaction-
SQL
创建存储过程是一种较为快速的方法,但对于初学者,使用Enterprise
Manager
更易理解,更为简单。
当创建存储过程时,需要确定存储过程的三个组成部分;
所有的输入参数以及传给调用者的输出参数。
被执行的针对数据库的操作语句,包括调用其它存储过程的语句;
返回给调用者的状态值,以指明调用是成功还是失败。
12.2.1
使用Enterprise
Manager
创建存储过程
按照下述步骤用Enterprise
Manager
创建一个存储过程:
启动Enterprise
Manager,
登录到要使用的服务器。
选择要创建存储过程的数据库,在左窗格中单击Stored
Procere
文件夹,此时在右窗格中显示该数据库的所有存储过程,如图12-1
所示。
右击Stored
Procere
文件夹,在弹出菜单中选择New
Stored
Procere,
此时打开创建存储过程对话框,
输入存储过程正文。
单击Check
Syntax,
检查语法是否正确。
单击OK,
保存。
在右窗格中,右击该存储过程,在弹出菜单中选择All
task,
选择
ManagePermissions,
设置权限,
12.2.2
用CREATE
PROCEDURE
命令创建存储过程
通过运用Create
Procere
命令能够创建存储过程,在创建存储过程之前,应该考虑到以下几个方面:
在一个批处理中,Create
Procere
语句不能与其它SQL
语句合并在一起;
数据库所有者具有默认的创建存储过程的权限,它可把该权限传递给其它的用户;
存储过程作为数据库对象其命名必须符合命名规则;
只能在当前数据库中创建属于当前数据库的存储过程。
用Create
Procere
创建存储过程的语法规则如下:
CREATE
PROC
[
EDURE
]
procere_name
[
;
number
]
[
{
@parameter
data_type
}
[
VARYING
]
[
=
default
]
[
OUTPUT
]
]
[
,...n
]
[
WITH
{
RECOMPILE
|
ENCRYPTION
|
RECOMPILE
,
ENCRYPTION
}
]
[
FOR
REPLICATION
]
AS
sql_statement
[
...n
]

6. 如何测试mysql触发器和存储过程

测试触发器的主要方法是:

  1. 手工或通过程序向触发器对应的源表插入或更新数据,观察数据库是否报错,如果没有错误则看一下数据是否准确更新到数据库了

测试存储过程的主要方法有:

  1. 通过客户端进行调用,java用的是CallabledStatement进行调用

  2. 通过SQL语句调用,格式是:call mypro(参数);

7. sql server如何测试存储过程与触发器的建立是否正确

存储过程用exec 存储过程名,然后执行
触发器你可以加上输出语句,用
as
print '执行了'
如果对update做的,就更新一条数据看看,是否有消息,如果没有就说明没建成功,如果有再修改,将输出删除就可以了,修改就不是create了,是alter

8. SQL Server的存储过程怎么写

SQL server中如何存储:

首先准备数据,测试存储过程

use ssqadm;

创建测试books表

create table books_test ( book_id int identity(1,1) primary key,

book_name varchar(20),book_price float,book_auth varchar(10));

插入测试数据

insert into books_test (book_name,book_price,book_auth)values

('论语',25.6,'孔子'),

('天龙八部',25.6,'金庸'),

('雪山飞狐',32.7,'金庸'),

('平凡的世界',35.8,'路遥'),

('史记',54.8,'司马迁');

select * from books_test;*/

创建无参存储过程

if (exists (select * from sys.objects where name = 'getAllBooks'))

drop proc getAllBooks

go

create procere getAllBooks

as

begin

select * from books_test;

调用,执行存储过程

exec getAllBooks;

end

go

修改存储过程

alter procere getallbooks

as

select book_name from books_test;

修改存储过程的名称

sp_rename getallbooks,proc_get_allbooks;

go

exec proc_get_allbooks;

go

创建带参数的存储过程

use ssqadm

go

if (exists (select * from sys.objects where name = 'searchbooks'))

drop proc searchbooks

exec searchbooks

执行存储searchbooks得到如下结果:

go

create procere searchbooks (@bookid int)--括号里面是

as

begin

declare @book_id int;定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。

set @book_id = @bookid;

select* from books_test where book_id = @book_id;

end;

go

-- exec searchbooks

执行存储searchbooks得到如下结果:

创建带两个参数的存储过程

use ssqadm

go

if (exists (select * from sys.objects where name = 'book_test2'))

drop proc book_test2

exec book_test2

执行存储book_test2得到如下结果:

go

create procere book_test2

(@bookid int,@bookname varchar(20))括号里面是

as

begin

declare @book_id int;

定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。

declare @book_name varchar(20);

set @book_id = @bookid;

set @book_name = @bookname;

select* from books_test where book_id =

@book_id and book_name = @book_name;

end;

go

exec book_test2

(8)sql测试存储方法扩展阅读:

SQL Server中查询存储命令子句:

USE [SSQADM]

Use 是跳转到哪个数据库,对这个数据库进行操作。

GO

GO向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号,相当于提交上面的SQL语句。

GO是把t-sql语句分批次执行

(一步成功了才会执行下一步,即一步一个GO)

/****** Object: StoredProcere [dbo].[PROC_four_five_hr]

Script Date: 07/30/2018 13:44:55 ******/

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ON

9. SQL Server 优化存储过程的方法有哪些

优化存储过程有很多种方法,下面介绍最常用的7种。
1.使用SET NOCOUNT ON选项
我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数。使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量。
2.使用确定的Schema
在使用表,存储过程,函数等等时,最好加上确定的Schema。这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索。而且搜索会导致编译锁定,最终影响性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable会在当前Schema下搜索,如果没有,再去dbo下面搜索,影响性能。而且如果你的表是csdn.TestTable的话,那么select * from TestTable会直接报找不到表的错误。所以写上具体的Schema也是一个好习惯。
3.自定义存储过程不要以sp_开头
因为以sp_开头的存储过程默认为系统存储过程,所以首先会去master库中找,然后在当前数据库找。建议使用USP_或者其他标识开头。
4.使用sp_executesql替代exec
原因在Inside Microsoft SQL Server 2005 T-SQL Programming书中的第四章Dynamic SQL里面有具体描述。这里只是简单说明一下:sp_executesql可以使用参数化,从而可以重用执行计划。exec就是纯拼SQL语句。
5.少使用游标
可以参考Inside Microsoft SQL Server 2005 T-SQL Programming书中的第三章Cursors里面有具体描述。总体来说,SQL是个集合语言,对于集合运算具有较高的性能,而Cursors是过程运算。比如对一个100万行的数据进行查询,游标需要读表100万次,而不使用游标只需要少量几次读取。
6.事务越短越好
SQL Server支持并发操作。如果事务过多过长,或是隔离级别过高,都会造成并发操作的阻塞,死锁。此时现象是查询极慢,同时cup占用率极低。
7.使用try-catch来处理错误异常
SQL Server 2005及以上版本提供对try-catch的支持,语法为:
begin try
----your code
end try
begin catch
--error dispose
end catch
一般情况可以将try-catch同事务结合在一起使用。
begin try
begin tran
--select
--update
--delete
--…………
commit
end try
begin catch
--if error
rollback
end catch
====================== 分割线 =======================

‘自己的一些调优经验’
1. 少使用游标是个很好的建议,为此,我自己也遇到过一些事故,是游标所造成的,由于,游标是逐行逐行操作的,当记录较多时,经常会遇到超时的情况。
2. 多表join做查询时,查询的字段尽量不要使用case when then else end的语法,或者使用用户函数,例如:
select (case when fType=1 then '是' else '否' end) as fTypeName, dbo.F_GetFullName(fID) as fFullName from Table1 inner join Table2……
当两个表的数据量非常大时,你可以在查询分析器中明显感觉到:直接查询fType和fID与查询上面两个字段的速度,很可能使用了一个case when then就导致超时。
针对这种情况,可以分两种做法:
第一,把一些简单的转换可以放在程序中完成。
第二,如果需要通过ID查询全名或者全称,类似的,可以创建好视图,直接查视图,或者,先把所有的fFullName查出来放到临时表中,直接join临时表(如果这个数据不是很多的话),获得fFullName。
3. 少使用一些嵌套的查询,用临时表缓存中间数据,例如:
select * from Table1
inner join (
select count(1) as count, Table2.ID2 from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2

) as t1 on t1.ID1 = Table1.ID1

我曾经遇到这样情况,上面的语句是那种情况的简化版本,把其他不影响结果的表格都去掉了,发现一个奇怪的现象:嵌套查询的结果集并不大,大约就200多行,Table1有6w条记录,结果,这个查询语句超时,查询分析器中执行2分钟也得不到结果。
后来,这样一改,就Ok了,3秒出结果:
select count(1) as count, Table2.ID2 into #temp from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2
select * from Table1
inner join #temp as t1 on t1.ID1 = Table1.ID1
这样一改,效率提升了几十倍,猜想:可能是嵌套的查询是动态的,每一行的join可能都需要先执行嵌套的查询,从而导致效率极差。
所以,如果查询足够复杂,join多个表,需要连接多个通过group by求和、求平均数等运算计算出来的中间数据,那么,不妨多使用临时表缓存中间数据。
4. 还有一些是必须遵守的一些默认规则,比如:

先过滤后连接。
查询的字段最要不要用“*”,指定需要用的字段,减少网络流量。

‘总结’
对于性能的追求是没有极限的,做到你所能做到的,这是一个很好的习惯。
有些业务逻辑放在存储过程中处理比较方便,而有些业务逻辑交给程序来处理,同样会提升系统整体的效率,看实际情况而定。
总之,尽可能减少这些容易引发性能问题的隐患,系统就会跑得更稳定更有效率,一切从小细节做起。

10. 在pl/sql中怎么测试存储过程

第一 create存储过程,此处报错,则是语法错误居多,需要根据情况修正语句。

第二 执行存储过程,验证执行结果,在Proceres包下 找到你自己创建的存储过程,右键点击测试按钮,出现测试窗口

第一个绿色箭头,意思直接跑起来,第二个进入男色方框,意思进入此模块内,第三个跳出当前运行模块,第四个跳转入错误点。

多用第二个