SQL Server存储过程使用说明书

合集下载

sql server 存储过程 事务用法

sql server 存储过程 事务用法

sql server 存储过程事务用法在SQL Server中,事务用于封装一系列的SQL语句,以确保操作的原子性、一致性、隔离性和持久性。

存储过程是一种在数据库中存储的预编译的SQL语句集合,可以通过执行存储过程来完成特定的任务。

事务用法如下:1.开始事务:通过BEGIN TRANSACTION语句开始一个事务。

2.执行SQL语句:在事务中执行需要操作的SQL语句,例如插入、更新或删除数据等。

3.判断结果:根据返回的结果判断操作是否成功。

4.提交事务:通过COMMIT语句提交事务,将操作结果永久保存到数据库中。

5.回滚事务:如果在事务执行过程中发生错误,可以通过ROLLBACK语句回滚事务,撤销之前的操作,使数据库恢复到事务开始前的状态。

事务还可以嵌套使用,并且支持保存点操作,可以在事务执行过程中设置保存点,在需要时可以选择性地回滚到指定的保存点。

存储过程适用于以下场景:1.复杂的业务逻辑:存储过程可以封装复杂的业务逻辑,提高代码重用性和可维护性。

2.提高性能:存储过程可以在数据库服务器上进行预编译,提高查询和操作的性能。

3.数据安全性:存储过程可以设置权限和访问控制,确保只有有权限的用户可以执行特定的操作。

4.简化网络通信:存储过程可以将多个SQL语句打包发送到数据库,减少网络通信的开销。

5.降低应用程序的复杂性:通过使用存储过程,可以将数据处理逻辑从应用程序中抽离出来,简化应用程序的代码和逻辑。

总之,事务和存储过程是SQL Server中非常重要的功能,它们可以帮助我们实现数据的一致性和可靠性,提高数据库的性能和安全性。

SQL Server 2012 数据库教程第7章 存储过程和触发器

SQL Server 2012 数据库教程第7章 存储过程和触发器
(3)用户存储过程。在SQL Server中,用户存储过程可以使用T-SQL语言编写, 也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。
① 存储过程:存储过程保存T-SQL语句集合,可以接收和返回用户提供的参 数。
② CLR存储过程:CLR存储过程是对Microsoft .NET Framework公共语言运行时 (CLR)方法的引用,可以接收和返回用户提供的参数。
则创建完成,如图7.4所示。
2.执行存储过程 在pxscj数据库的“存储过程”目录下选择要执行的存储过程,如 student_info1,右键单击鼠标,选择“执行存储过程”菜单项。在弹出的“执行 过程”窗口中会列出存储过程的参数形式,如果“输出参数”栏为“否”,则表
以下命令的执行结果与上面的相同:
EXECUTE student_info1 @name='王林', @cname='计算机基础'
或者: DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础'
接下来执行存储过程do_action来查看结果: DECLARE @str char(8) EXEC dbo.do_action 0, @str OUTPUT SELECT @str; 执行结果显示“修改成功”。
Hale Waihona Puke 4)使用带有通配符参数的存储过程【例7.4】 从3个表的连接中返回指定学生的学号、姓名、所选课程名称及该
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标 赋值给局部游标变量,然后通过该游标变量读取记录。

(完整版)SQL存储过程全面实例讲解

(完整版)SQL存储过程全面实例讲解

SQL实例讲解一、创建存储过程结构CREATE PROCEDURE创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL 语句的集合。

可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。

也可以创建在 Microsoft SQL Server启动时自动运行的存储过程。

语法CREATE PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]二、存储过程实例讲解1. 使用带有复杂 SELECT 语句的简单过程下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。

该存储过程不使用任何参数。

USE pubsIF EXISTS (SELECT name FROM sysobjectsWHERE name = 'au_info_all' AND type = 'P')DROP PROCEDURE au_info_allGOCREATE PROCEDURE au_info_allASSELECT au_lname, au_fname, title, pub_nameFROM authors a INNER JOIN titleauthor taON a.au_id = ta.au_id INNER JOIN titles tON t.title_id = ta.title_id INNER JOIN publishers pON t.pub_id = p.pub_idGOau_info_all 存储过程可以通过以下方法执行:EXECUTE au_info_all-- OrEXEC au_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_all2. 使用带有参数的简单过程下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。

SQL server实验五 存储过程创建与应用

SQL server实验五 存储过程创建与应用

实验五 存储过程创建与应用
一、实验目的
使学生理解存储过程的概念,掌握创建存储过程的使用、执行存储过程和查看、修改、删除存储过程的方法。

二、实验内容
(1)利用企业管理器创建存储过程student_grade,要求实现如下功能:查询“学生-课程”数据库中每个学生各门功课的成绩,其中包括每个学生的sno,sname,cname,grade。

(2)利用查询分析器创建名为proc_exp的存储过程,要求实现如下功能:从sc表中查询某一学生考试平均成绩。

(3)修改存储过程proc_exp,要求实现如下功能:输入学生学号,根据该学生所选课程的平均成绩显示提示信息,即如果平均成绩在60分以上,显示“此学生综合成绩合格,成绩为XX分”,否则显示“此学生总和成绩不合格,成绩为XX分”。

(4)创建名为proc_add的存储过程,要求实现如下功能:向sc表中添加学生成绩记录。

调用proc_add,向sc表中添加学生成绩记录。

(5)调用存储过程proc_exp,输入学生学号,显示学生综合成绩是否合格。

(6)删除刚刚创建的proc_add和proc_exp两个存储过程。

三、实验过程
(1)
(2)
(3)
(4)
(5)
(6)
四、实验总结
本次试验主要实现的是对储存过程的各种应用。

储存过程的建立(create语句)与调用(exec语句),无参数储存过程和有参数储存过程的相对比的应用以更好的理解参数在储存过程中的具体作用,最后是储存过程的删除,利用 drop 语句即可实现。

SQL Server存储过程和参数示例

SQL Server存储过程和参数示例

一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程。

微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了)。

虽然这些存储过程可能很有用并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。

下面的图表显示了当许多存储过程从一个Microsoft SQL Server版本移入另一个版本时,引入了新的存储过程,而原来的一些则从安装包里删除了。

大多数的存储过程,如果不是所有的,要求用户是系统管理员服务器角色以便执行这些存储过程。

和文件系统交互的存储过程还要求执行存储过程的用户(还有SQL Server的服务帐户)具有访问文件/文件夹的权限。

sp_executeresultset微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利小程序。

它允许你在空闲时通过使用SELECT查询产生动态SQL代码。

然后,作为结果的SQL命令将会在数据库上执行。

它允许你创建单独的一行代码,这行代码可以在单步中查询到你的数据库里的每一个表的记录数目(就像例子中所显示的)。

这是一个未公开的存储过程,而且无法知道它为什么被删除了。

但是,唉,这个便利的有用存储过程已经没有了。

exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''',count(*) FROM '' + namefrom sysobjectswhere xtype = ''U'''sp_MSforeachdb / sp_MSforeachtablesp_MSforeachdb / sp_MSforeachtable两个存储过程,sp_MSforeachdb和sp_MSforeachtable封装了一个指针。

SQLserver存储过程语法及实例

SQLserver存储过程语法及实例

SQLserver存储过程语法及实例存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。

--------------------基本语法--------------------一.创建存储过程create procedure sp_name()begin.........end二.调用存储过程1.基本语法:call sp_name()注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递三.删除存储过程1.基本语法:drop procedure sp_name//2.注意事项(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程四.其他常用命令1.show procedure status显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等2.show create procedure sp_name显示某一个mysql存储过程的详细信息--------------------数据类型及运算符--------------------一、基本数据类型:略二、变量:自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100;变量分为用户变量和系统变量,系统变量又分为会话和全局级变量用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理1、在mysql客户端使用用户变量mysql> SELECT 'Hello World' into @x;mysql> SELECT @x;mysql> SET @y='Goodbye Cruel World';mysql> select @y;mysql> SET @z=1+2+3;mysql> select @z;2、在存储过程中使用用户变量mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');mysql> SET @greeting='Hello';mysql> CALL GreetWorld( );3、在存储过程间传递全局范围的用户变量mysql> CREATE PROCEDURE p1( ) SET @last_procedure='p1';mysql> CREATE PROCEDURE p2( ) SELECT CONCAT('Last procedure was ',@last_procedure);mysql> CALL p1( );mysql> CALL p2( );三、运算符:1.算术运算符+ 加 SET var1=2+2; 4- 减 SET var2=3-2; 1* 乘 SET var3=3*2; 6/ 除 SET var4=10/3; 3.3333DIV 整除 SET var5=10 DIV 3; 3% 取模 SET var6=10%3 ; 12.比较运算符> 大于 1>2 False< 小于 2<1 False<= 小于等于 2<=2 True>= 大于等于 3>=2 TrueBETWEEN 在两值之间 5 BETWEEN 1 AND 10 TrueNOT BETWEEN 不在两值之间 5 NOT BETWEEN 1 AND 10 False IN 在集合中 5 IN (1,2,3,4) FalseNOT IN 不在集合中 5 NOT IN (1,2,3,4) True= 等于 2=3 False<>, != 不等于 2<>3 False<=> 严格比较两个NULL值是否相等NULL<=>NULL TrueLIKE 简单模式匹配 "Guy Harrison" LIKE "Guy%" TrueREGEXP 正则式匹配"Guy Harrison" REGEXP "[Gg]reg" FalseIS NULL 为空 0 IS NULL FalseIS NOT NULL 不为空 0 IS NOT NULL True3.逻辑运算符4.位运算符| 或& 与<< 左移位>> 右移位~ 非(单目运算,按位取反)注释:mysql存储过程可使用两种风格的注释双横杠:--该风格一般用于单行注释c风格:/* 注释内容 */ 一般用于多行注释--------------------流程控制--------------------一、顺序结构二、分支结构ifcase三、循环结构for循环while循环loop循环repeat until循环注:区块定义,常用begin......end;也可以给区块起别名,如:lable:begin...........end lable;可以用leave lable;跳出区块,执行区块以后的代码begin和end如同C语言中的{ 和 }。

SqlServer存储过程详解

SqlServer存储过程详解

SqlServer存储过程详解SqlServer存储过程详解1.创建存储过程的基本语法模板:if (exists (select*from sys.objects where name ='pro_name'))drop proc pro_namegocreate proc pro_name@param_name param_type [=default_value]asbeginsql语句endps:[]表⽰⾮必写内容。

sys.objects存储的是本数据库中的信息,不仅仅存储表名,还有存储过程名、视图名、触发器等等。

例如:1if (exists (select*from sys.objects where name ='USP_GetAllUser'))2drop proc USP_GetAllUser3go4create proc USP_GetAllUser5@UserId int=16as7set nocount on;8begin9select*from UserInfo where Id=@UserId10endps:SQL Server 实⽤⼯具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。

当前批处理语句是⾃上⼀ GO 命令后输⼊的所有语句,若是第⼀条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。

2.调⽤⽅法:exec P_GetAllUser 2;ps:⼀般在执⾏存储过程是,最好加上架构名称,例如 P_GetAllUser 这样可以可以减少不必要的系统开销,提⾼性能。

因为如果在存储过程名称前⾯没有加上架构名称,SQL SERVER ⾸先会从当前数据库sys schema(系统架构)开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构(系统管理员架构)⾥⾯查找。

sqlserver 函数中调用存储过程

sqlserver 函数中调用存储过程

SQL Server 函数中调用存储过程简介在 SQL Server 数据库中,函数(Function)和存储过程(Stored Procedure)是分别用于执行特定功能的两种对象。

函数是一种可以接受参数并返回一个值的操作,而存储过程则是一组预定义的 SQL 语句集合,可接受输入参数并返回结果集或修改数据库状态。

本文将介绍如何在 SQL Server 函数中调用存储过程,实现在函数内部对存储过程进行调用并获取结果的功能。

通过调用存储过程,我们可以将复杂的逻辑封装起来,并在函数中直接使用。

为什么要在函数中调用存储过程?在 SQL Server 中,函数具有一些限制和特性,如只能访问数据库的静态数据、不能修改数据库状态等。

这些限制使得函数的功能有一定的局限性。

而存储过程可以执行更复杂的操作,包括访问动态数据、修改数据库状态、执行事务控制等。

因此,将存储过程与函数结合使用,可以充分发挥它们各自的优势,实现更灵活和强大的功能。

通过在函数中调用存储过程,我们可以在函数内部执行复杂的业务逻辑,同时利用存储过程的强大功能,使函数具有更高的灵活性和功能性。

在函数中调用存储过程的实现方法下面将介绍在 SQL Server 函数中调用存储过程的实现方法。

主要分为以下几个步骤:1. 创建存储过程首先,我们需要创建一个存储过程,用于实现我们想要的功能。

可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建存储过程。

存储过程的创建语法如下:CREATE PROCEDURE procedure_name@parameter1 data_type,@parameter2 data_type,...ASBEGIN-- 存储过程的逻辑代码END在存储过程中,可以定义输入参数和输出参数,根据实际需求进行编写。

存储过程中的逻辑代码可以包括 SQL 查询、数据处理、事务控制等。

2. 创建函数创建函数的语法与创建存储过程类似,可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sql server存储过程使用说明书引言首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用sql语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同sql语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

请大家先看一个小例子:create proc query_bookasselect * from bookgo--调用存储过程exec query_book请大家来了解一下存储过程的语法。

create proc [ edure ] procedure_name [ ; number ][ { @parameter data_type }[ varying ] [ = default ] [ output ]] [ ,...n ][ with{ recompile | encryption | recompile , encryption } ][ for replication ]as sql_statement [ ...n ]一、参数简介1、procedure_name新存储过程的名称。

过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。

要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。

完整的名称(包括 # 或 ##)不能超过 128 个字符。

指定过程所有者的名称是可选的。

2、;number是可选的整数,用来对同名的过程分组,以便用一条 drop procedure 语句即可将同组的过程一起除去。

例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。

drop procedure orderproc 语句将除去整个组。

如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。

3、@parameter过程中的参数。

在 create procedure 语句中可以声明一个或多个参数。

用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。

存储过程最多可以有 2100 个参数。

使用@符号作为第一个字符来指定参数名称。

参数名称必须符合标识符的规则。

每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。

默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。

4、data_type参数的数据类型。

所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。

不过,cursor 数据类型只能用于 output 参数。

如果指定的数据类型为 cursor,也必须同时指定 varying 和 output 关键字。

说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。

5、varying指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。

仅适用于游标参数。

6、default参数的默认值。

如果定义了默认值,不必指定该参数的值即可执行过程。

默认值必须是常量或 null。

如果过程将对该参数使用 like 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

7、output表明参数是返回参数。

该选项的值可以返回给 exec[ute]。

使用 output 参数可将信息返回给调用过程。

text、ntext 和 image 参数可用作 output 参数。

使用 output 关键字的输出参数可以是游标占位符。

8、n表示最多可以指定 2100 个参数的占位符。

9、{recompile | encryption | recompile, encryption}recompile 表明 sql server 不会缓存该过程的计划,该过程将在运行时重新编译。

在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 recompile 选项。

encryption 表示 sql server 加密 syscomments 表中包含 create procedure 语句文本的条目。

使用 encryption 可防止将过程作为 sql server 复制的一部分发布。

说明:在升级过程中,sql server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

10、for replication指定不能在订阅服务器上执行为复制创建的存储过程。

.使用 for replication 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。

本选项不能和 with recompile 选项一起使用。

11、as指定过程要执行的操作。

12、sql_statement过程中要包含的任意数目和类型的 transact-sql 语句。

但有一些限制。

13、n是表示此过程可以包含多条 transact-sql 语句的占位符。

14、注释/*和*/之间的为注释,可以包含一行和多行的说明文字。

15、其他说明存储过程的最大大小为 128 mb。

二、存储过程的优点都有哪些呢?1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的sql语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用sp来封装数据库操作。

当对数据库进行复杂操作时(如对多个表进行update,insert,query,delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。

在代码上看,sql语句和程序代码语句的分离,可以提高程序代码的可读性。

3. 存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。

4. 安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:(1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。

(2)扩展存储过程以xp_开头,用来调用操作系统提供的功能exec master..xp_cmdshell 'ping 10.8.16.1'(3)用户自定义的存储过程,这是我们所指的存储过程常用格式模版:create procedure procedue_name [@parameter data_type][output][with]{recompile|encryption} as sql_statement解释:output:表示此参数是可传回的with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。

三、实例讲解实例1:只返回单一记录集的存储过程。

要求1:查询表bankmoney的内容的存储过程create procedure sp_query_bankmoneyasselect * from bankmoneygoexec sp_query_bankmoney注* 在使用过程中只需要把中的sql语句替换为存储过程名,就可以了很方便吧!实例2(向存储过程中传递参数):加入一笔记录到表bankmoney,并查询此表中userid= zhangsan的所有存款的总金额。

create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param 4 int,@param5 int outputwith encryption ---------加密asinsert bankmoney (id,userid,sex,money) values(@param1,@param2,@param3, @param4) select @param5=sum(money) from bankmoney where userid='zhangsan'go在sql server查询分析器中执行该存储过程的方法是:declare @total_price intexec insert_bank '004','zhangsan','男',100,@total_price outputprint '总余额为'+convert(varchar,@total_price)go在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):1.以return传回整数2.以output格式传回参数3.recordset传回值的区别:output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。

实例3:使用带有复杂 select 语句的简单过程下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。

该存储过程不使用任何参数。

use pubsif exists (select name from sysobjectswhere name = 'au_info_all' and type = 'p')drop procedure au_info_allgocreate procedure au_info_allasselect au_lname, au_fname, title, pub_namefrom authors a inner join titleauthor taon a.au_id = ta.au_id inner join titles ton t.title_id = ta.title_id inner join publishers pon t.pub_id = p.pub_idgoau_info_all 存储过程可以通过以下方法执行:execute au_info_all-- orexec au_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_all实例4:使用带有参数的简单过程create procedure au_info@lastname varchar(40),@firstname varchar(20)asselect au_lname, au_fname, title, pub_namefrom authors a inner join titleauthor taon a.au_id = ta.au_id inner join titles ton t.title_id = ta.title_id inner join publishers pon t.pub_id = p.pub_idwhere au_fname = @firstnameand au_lname = @lastnamegoau_info 存储过程可以通过以下方法执行:execute au_info 'dull', 'ann'-- orexecute au_info @lastname = 'dull', @firstname = 'ann' -- orexecute au_info @firstname = 'ann', @lastname = 'dull' -- orexec au_info 'dull', 'ann'-- orexec au_info @lastname = 'dull', @firstname = 'ann'-- orexec au_info @firstname = 'ann', @lastname = 'dull'如果该过程是批处理中的第一条语句,则可使用:au_info 'dull', 'ann'-- orau_info @lastname = 'dull', @firstname = 'ann'-- orau_info @firstname = 'ann', @lastname = 'dull'实例5:使用带有通配符参数的简单过程create procedure au_info2@lastname varchar(30) = 'd%',@firstname varchar(18) = '%'asselect au_lname, au_fname, title, pub_namefrom authors a inner join titleauthor taon a.au_id = ta.au_id inner join titles ton t.title_id = ta.title_id inner join publishers pon t.pub_id = p.pub_idwhere au_fname like @firstnameand au_lname like @lastnamegoau_info2 存储过程可以用多种组合执行。

相关文档
最新文档