MSSQL中存储过程的可选参数的定义和使用

编辑日志:

160508创建

160530优化添加:显示传参

160918 添加:SQL高亮显示


可选参数的存在,可以极大的降低代码的重复冗余。在数据库开发中,也是如此。现在针对MSSQL中存储过程的可选参数的定义和使用进行基本的介绍,留作备忘。



#准备工作:

在db_test中建立一张测试表T_test:

 

USE db_test;

CREATE TABLE dbo.T_test
(
Id  INT  IDENTITY(1,1) NOT NULL
,Name  NVARCHAR(20) NOT NULL
,Sex  BIT  DEFAULT(0)
);

插入一些数据:

[code=SQL]

INSERT INTO dbo.T_test(Name,Sex)
VALUES(N'NAME1','1')
,(N'NAME2','0')
,(N'NAME3','1')
,(N'NAME4','0');

[/code]


查询测试数据:

[code=SQL]
SELECT Id,Name,Sex
FROM dbo.T_test;
[/code]

结果为:

[code=SQL]

Id Name Sex
1 NAME1 1
2 NAME2 0
3 NAME3 1
4 NAME4 0

[/code]


#存储过程

创建一个存储过程:

[code=SQL]
IF OBJECT_ID('dbo.usp_test_get_name_by_id','P') IS NOT NULL
DROP PROC dbo.usp_test_get_name_by_id;
GO

CREATE PROC dbo.usp_test_get_name_by_id
@Name AS NVARCHAR(20) OUTPUT
,@Id AS INT = 1  --DEFAULT VALUE: 1
,@Sex AS BIT = 1 --DEFAULT VALUE: 1

AS
BEGIN 

SET NOCOUNT ON;


SELECT @Name = Name
FROM dbo.T_test
WHERE  Id = @Id
  AND Sex = @Sex;

END
GO
[/code]


对存储过程进行调用:

1)不传递ID和Sex

[code=SQL]
DECLARE @Name NVARCHAR(20);
EXEC dbo.usp_test_get_name_by_id @Name OUTPUT;

SELECT @Name AS NAME;
[/code]

结果为:

[code=SQL]
NAME
-------------
NAME1
[/code]


说明:

可见,当调用存储过程的时候不传递ID,则存储过程会使用(存储过程)定义时设定的ID的默认值1,Sex默认值为1 。


2)传递ID

[code=SQL]
DECLARE @Name NVARCHAR(20);
EXEC dbo.usp_test_get_name_by_id @Name OUTPUT,'3';

SELECT @Name AS NAME;
[/code]

结果为:

[code=SQL]

NAME

-------------

NAME3

[/code]

说明:

当调用时传递ID,则存储过程在执行的时候会使用从外部传递进来的ID值,因为没有传递进来Sex的值,故使用Sex默认值1进行SQL查询。


3)显式传参【新加160530】

        上面介绍的都属于"非显式"传参,即:所传参数的位置必须严格按照存储过程定义时的位置进行"安排"。这样的限制,对于调用和后期维护而言是非常恶心的事情,这类似于:在SELECT查询中使用   *  将所有符合要求的数据返回给调用者,而所得数据的字段顺序是随着查询时表中字段的顺序来确定的,即:如果后期维护对表中字段的顺序进行了改变,那么将会对调用者带来"连锁反应",这是不能忽视的。

1>查询Id为3,Sex为1的姓名:

[code=SQL]

DECLARE @Name NVARCHAR(20);
EXEC dbo.usp_test_get_name_by_id @Name OUTPUT,3,1;

SELECT @Name AS NAME;

[/code]

查询结果为:

[code=SQL]
NAME

------------
NAME3
[/code]

2>如果调用存储过程时,手抖了一下,3和1的位置颠倒了,那么查询结果为:

[code=SQL]
NAME

------------
NAME1
[/code]

看!神奇的返回了Id为1的那条数据!虽然这不是我们想要的数据,但这是符合逻辑的。因为MSSQL在匹配参数时,将3转换为了bit类型,因   3 <>  0  ,所以转换成bit后的值为1。你可以尝试换一下其他数。

3>MSSQL中可以进行显示传参:

对于上面2>中的情况,使用显示传参会非常的爽:

[code=SQL]

SELECT * FROM dbo.T_test;

DECLARE @Name NVARCHAR(20);
EXEC dbo.usp_test_get_name_by_id 
@Name = @Name OUTPUT
,@Sex = 1
,@Id = 3;


SELECT @Name AS NAME;

[/code]

查询结果为:

[code=SQL]

NAME

------------
NAME3

[/code]


所以,你可以在调用存储过程时,按照你想要的参数传递顺序进行编辑,而不是必须严格依赖于存储过程定义(或最新定义)中参数的位置。

这样,就算后期存储过程对参数的顺序进行了修改,也不会对调用有任何的影响!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MySQL定义存储过程参数是可以设置成可选的。你可以在存储过程参数列表使用默认值来实现参数可选性。当调用存储过程时,如果没有提供该参数的值,那么将会使用默认值作为参数的值。这样就可以实现参数可选性。例如,可以使用以下语法来定义一个具有可选参数存储过程: CREATE PROCEDURE sp_name (IN param1 INT, IN param2 INT DEFAULT 0) BEGIN -- 存储过程的逻辑代码 END 在上述示例,param1是必需的参数,而param2是可选参数,如果没有提供param2的值,将使用默认值0。这样,在调用存储过程时,可以选择性地提供param2的值,如果没有提供,则使用默认值。 引用: \[1\] 使用create PROCEDURE语句创建存储过程。CREATE PROCEDURE:创建存储过程的关键字。sp_name:为存储过程的名称。proc_parameter:存储过程参数列表。characters:用于指定存储过程的特性。routine_body:是SQL代码的内容。也可以只是用begin ...end来表示SQL代码的开始和结束。 \[2\] MySQL可以使用ALTER语句修改存储过程的特性。ALTER{PROCEDURE|FUNCTION}sp_name \[characteristic...\]sp_name:表示存储过程或者函数的名称。characteristic:表示要修改存储过程的哪个部分。 \[3\] 存储过程有多种调用方法。必须使用CALL语句调用,并且存储过程和数据库相关。如果要执行其他数据库存储过程,需要指定数据库的名称。CALL sp_name(\[parameter\],...)sp_name:为存储过程的名称。parameter:为存储过程参数。 #### 引用[.reference_title] - *1* *2* *3* [MySQL操作之存储过程](https://blog.csdn.net/weixin_44624117/article/details/120383054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值