MSSQL中存储过程的可选参数的定义和使用_SQL高亮显示
来源:互联网 发布:广州锋泽网络垃圾 编辑:程序博客网 时间:2024/05/19 10:41
编辑日志:
160508创建
160530优化添加:显式传参
160916SQL语句高亮显示、格式优化
可选参数的存在,可以极大的降低代码的重复冗余。在数据库开发中,也是如此。现在针对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));
插入一些数据:
INSERT INTO dbo.T_test(Name,Sex)VALUES(N'NAME1','1'),(N'NAME2','0'),(N'NAME3','1'),(N'NAME4','0');
查询测试数据:
SELECT Id,Name,SexFROM dbo.T_test;
结果为:
Id Name Sex-- ----- ---1 NAME1 12 NAME2 03 NAME3 14 NAME4 0
>存储过程
创建一个存储过程:
IF OBJECT_ID('dbo.usp_test_get_name_by_id','P') IS NOT NULLDROP PROC dbo.usp_test_get_name_by_id;GOCREATE 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: 1ASBEGIN SET NOCOUNT ON;SELECT @Name = NameFROM dbo.T_testWHERE Id = @Id AND Sex = @Sex;ENDGO
对存储过程进行调用:
1)不传递ID和Sex
DECLARE @Name NVARCHAR(20);EXEC dbo.usp_test_get_name_by_id @Name OUTPUT;SELECT @Name AS NAME;
结果为:
NAME-----NAME1
说明:
可见,当调用存储过程的时候不传递ID,则存储过程会使用(存储过程)定义时设定的ID的默认值1,Sex默认值为1 。
2)传递ID
DECLARE @Name NVARCHAR(20);EXEC dbo.usp_test_get_name_by_id @Name OUTPUT,'3';SELECT @Name AS NAME;
结果为:
NAME-----NAME3
说明:
当调用时传递ID,则存储过程在执行的时候会使用从外部传递进来的ID值,因为没有传递进来Sex的值,故使用Sex默认值1进行SQL查询。
3)显式传参【新加160530】
上面介绍的都属于"非显式"传参,即:所传参数的位置必须严格按照存储过程定义时的位置进行"安排"。这样的限制,对于调用和后期维护而言是非常恶心的事情,这类似于:在SELECT查询中使用 * 将所有符合要求的数据返回给调用者,而所得数据的字段顺序是随着查询时表中字段的顺序来确定的,即:如果后期维护对表中字段的顺序进行了改变,那么将会对调用者带来"连锁反应",这是不能忽视的。
1>查询Id为3,Sex为1的姓名:
DECLARE @Name NVARCHAR(20);EXEC dbo.usp_test_get_name_by_id @Name OUTPUT,3,1;SELECT @Name AS NAME;
查询结果为:
NAME-----NAME3
2>如果调用存储过程时,手抖了一下,3和1的位置颠倒了,那么查询结果为:
NAME-----NAME1
看!神奇的返回了Id为1的那条数据!虽然这不是我们想要的数据,但这是符合逻辑的。因为MSSQL在匹配参数时,将3转换为了bit类型,因 3 <> 0 ,所以转换成bit后的值为1。你可以尝试换一下其他数。
3>MSSQL中可以进行显示传参:
对于上面2>中的情况,使用显示传参会非常的爽:
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;
查询结果为:
NAME-----NAME3
所以,你可以在调用存储过程时,按照你想要的参数传递顺序进行编辑,而不是必须严格依赖于存储过程定义(或最新定义)中参数的位置。
这样,就算后期存储过程对参数的顺序进行了修改,也不会对调用有任何的影响!
0 0
- MSSQL中存储过程的可选参数的定义和使用_SQL高亮显示
- MSSQL中存储过程的可选参数的定义和使用
- MSSQL 存储过程的定义和使用
- mssql使用输出参数的存储过程
- C#中可选参数和命名参数的定义及使用
- 悬而未决:MSSQL中存储过程的加密和解密
- MSSQL中批量修改数据表和存储过程的所有者
- 删除MSSQL中危险的存储过程
- oracle中存储过程的参数定义技术要点
- 存储过程中IN 参数的使用
- PHP如何得到mssql的存储过程的输出参数
- PHP如何得到mssql的存储过程的输出参数?
- PHP如何得到mssql的存储过程的输出参数?
- 实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理
- 实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理
- 存储过程性能测试之_Sql执行速度的比较
- 可选参数的便捷使用
- 2008 mssql的存储过程
- [Leetcode] Simplify Path
- 关闭浏览器后Session失效原因分析
- KMP算法小结
- svn原理----revert,回滚
- 短网址(短链)实现唤起App
- MSSQL中存储过程的可选参数的定义和使用_SQL高亮显示
- 次小生成树
- Java的四种引用,强弱软虚,用到的场景。
- 解决Xcode 8 Console 输出系统网络连接log的问题
- 打印自身源代码的程序
- C/C++进阶学习笔记(三) 异常处理 try catch throw
- Recast & Detour 寻路引擎的基本流程
- 一张图说明进程, 线程, 操作系统内存管理
- 第一节-数据结构