[SQL77学习笔记]存储过程,函数--参数默认值的一些问题

SQL77 2010-07-10 10:32:44
加精
--今天回帖偶遇一问题,存储过程默认值的问题,然后查了MSDN,所以记一下
--http://technet.microsoft.com/zh-cn/library/ms189330.aspx

--先看几个过程的执行

--先创建我们一般的写法

CREATE PROC P(@S VARCHAR(1)='A')

AS

SELECT @S

GO

EXEC P

GO
--1
ALTER PROC P (@S DECIMAL=A)
AS
SELECT @S
GO
EXEC P
GO
/*

服务器: 消息 8114,级别 16,状态 5,过程 P,行 0
将数据类型 nvarchar 转换为 numeric 时出错。

*/

--2
ALTER PROC P (@S VARCHAR(1)=中)
AS
SELECT @S
GO
EXEC P
GO
/*


----


(所影响的行数为 1 行)


*/
--4
ALTER PROC P (@S NVARCHAR(1)=中)
AS
SELECT @S
GO
EXEC P
GO
/*
----


(所影响的行数为 1 行)

*/
--数据类型优先级 http://msdn.microsoft.com/zh-cn/library/ms190309(SQL.90).aspx
--1参数默认值传递 有些 字符类型可以不用加''来限定,
--2参数转换过程中,默认值会优先按参数指定类型转换,否则转成此类型中最高的级别


--5
ALTER PROC P (@S VARCHAR(10)=1AA)
AS
SELECT @S
GO
EXEC P
GO
/*
服务器: 消息 170,级别 15,状态 1,过程 P,行 1
第 1 行: 'AA' 附近有语法错误。
*/

--6
ALTER PROC P (@S VARCHAR(10)=A A)
AS
SELECT @S
GO
EXEC P
GO
/*
服务器: 消息 170,级别 15,状态 1,过程 P,行 1
第 1 行: 'A' 附近有语法错误。
*/

--此条可参考上面网址
--/*指定参数的默认值
-- 通过为可选参数指定默认值,可创建带有可选参数的存储过程。执行该存储过程时,如果未指定其他值,则使用默认值。
--
-- 如果在存储过程中没有指定参数的默认值,并且调用程序也没有在执行存储过程时为该参数提供值,那么会返回系统错误,因此指定默认值是必要的。
--
-- 如果不能为参数指定合适的默认值,则可以指定 NULL 作为参数的默认值,并在未提供参数值而执行存储过程的情况下,使存储过程返回一条自定义消息。
--
-- 注意:
-- 如果默认值是包含嵌入空格或标点符号的字符串,或者以数字开头(例如,6xxx),那么该默认值必须用直的单引号引起来。 */


---第一次写博客,没啥技术含量,欢迎大家抛砖指导,函数的默认参数也类似,大家可以试试

--原帖子http://topic.csdn.net/u/20100709/22/4ca8d993-aa1a-4157-b2c3-7227006d8b6b.html?seed=1368739759&r=66863373#r_66863373

--既然讲到存储过程参数默认值,当然少不了函数,所以延伸一下

--函数和存储过程的参数默认值,参数类型,返回类型区别是什么呢?
--1 主要是在执行时的一些区别,存储过程可以省略带默认值的参数,而函数则不行,必须指定DEFAULT关键字来代替
--2 参数类型,返回类型

--可参考联机丛书

--存储过程
/*
--参数最大限制,
过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
存储过程最多可以有 2.100 个参数。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。
每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。

默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。

--参数数据类型

参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。
不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,
也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。

--输出类型和默认

VARYING

指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。

default

参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。
如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

OUTPUT

表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。
Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

n

表示最多可以指定 2.100 个参数的占位符。
*/

*/


--函数
/*
--参数最大限制,以及默认值的指定
用户定义函数的参数。CREATE FUNCTION 语句中可以声明一个或多个参数。函数最多可以有 1,024 个参数。
函数执行时每个已声明参数的值必须由用户指定,除非该参数的默认值已经定义。 如果函数的参数有默认值,
在调用该函数时必须指定"default"关键字才能获得默认值。这种行为不同于存储过程中有默认值的参数,在存储过程中省略参数也意味着使用默认值。


使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个函数的参数仅用于该函数本身;
相同的参数名称可以用在其它函数中。参数只能代替常量;而不能用于代替表名、列名或其它数据库对象的名称。

--参数数据类型

参数的数据类型。所有标量数据类型(包括 bigint 和 sql_variant)都可用作用户定义函数的参数。
不支持 timestamp 数据类型和用户定义数据类型。
不能指定非标量类型(例如 cursor 和 table)。

--返回类型

是标量用户定义函数的返回值。scalar_return_data_type
可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。


*/

--总结

--参数类型
--存储过程可以使用CURSOR作为参数类型,不过是输出参数,并且没有最大限制,
--参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。最大限制2100
--参数的数据类型。所有标量数据类型(包括 bigint 和 sql_variant)都可用作用户定义函数的参数。最大限制1024

--默认值
--存储过程默认值,执行时可以不用指定,函数默认值则要指定DEFAULT关键字

--返回类型
--函数
--可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。
--过程
--使用 OUTPUT 参数可将信息返回给调用过程。
--Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符



--将GETDATE()转换为函数默认值的解决办法,A 创建一个GETDATE视图,B 作为参数传入;暂时知道这两种做法,欢迎大家提供新的方法

--存储过程里面可以动态EXEC 执行语句,等于可以传入表名作参数,而函数不支持动态执行;;;;

--以上内容参考联机丛书及MSDN,转载可不注明作者信息
...全文
4318 201 打赏 收藏 转发到动态 举报
写回复
用AI写文章
201 条回复
切换为时间正序
请发表友善的回复…
发表回复
如此疲惫 2011-08-29
  • 打赏
  • 举报
回复
文韬武略
caomeng2010 2010-08-03
  • 打赏
  • 举报
回复
做个小记号
tp26021340 2010-07-16
  • 打赏
  • 举报
回复
不太明白意思,顶过
Andy-Xiejf 2010-07-16
  • 打赏
  • 举报
回复
顶了再研究

qiujun2002 2010-07-15
  • 打赏
  • 举报
回复
长知识了,谢谢哈
taikongxinke 2010-07-15
  • 打赏
  • 举报
回复
学习,收藏好先!
xueyuan299 2010-07-15
  • 打赏
  • 举报
回复
支持一下有奉献精神的!
hb1106503571 2010-07-14
  • 打赏
  • 举报
回复
看不懂,不过还是得顶了!
ben_0788 2010-07-14
  • 打赏
  • 举报
回复
学习中....
Adchilles 2010-07-14
  • 打赏
  • 举报
回复
好,很好,非常好.
lzz19831001 2010-07-14
  • 打赏
  • 举报
回复
就解放了时间按到了房间是拉开大家
  • 打赏
  • 举报
回复
来学习学习
longvslove 2010-07-13
  • 打赏
  • 举报
回复
文成武德、泽被苍生
千秋万载,一统江湖!
zhanghe634 2010-07-13
  • 打赏
  • 举报
回复
这个一定要学习啊 非常好
abcc12321 2010-07-13
  • 打赏
  • 举报
回复
学习学习,但不很懂啊!
luckyzqy 2010-07-13
  • 打赏
  • 举报
回复
路过,学习
xufei0801 2010-07-13
  • 打赏
  • 举报
回复
学习了。。。。
zhyang18 2010-07-13
  • 打赏
  • 举报
回复
学习学习
mm3645 2010-07-13
  • 打赏
  • 举报
回复
关注!!!
maoliangcai 2010-07-13
  • 打赏
  • 举报
回复
在学多一点啊 就好了 多谢一点
加载更多回复(181)
Oracle 10g 开发与管理 本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 第一讲 Oacle关系数据库 9 一. Oracle的安装 9 二. 用浏览器进入em 企业管理器 11 三.启动DBCA的方法 11 四.服务设置 11 五. Oracle的卸载 11 六. Oracle数据库的应用系统结构 11 七. 补充资料——oracle安装时出现的问题 12 第二讲 Oacle数据库体系结构 14 一. 物理存储结构——(数据库载体) 14 1.数据文件(.DBF) 14 2.日志文件 (.Log) 14 1) 日志文件 15 2) 数据库工作模式 15 3.控制文件(.ctl) 15 4.参数文件 (.ora) 16 二. 逻辑存储结构 17 1.数据块 (Data Blocks) 17 2.盘区(Extent) 18 3.段 (Segment) 18 4.表空间(Table Spaces) P34 18 三. 内存结构 19 1.数据缓冲区: 内存的40% 19 2.日志缓冲区: 19 3.数据字典缓冲区: 19 4.共享池 内存的10% 19 5.大池 5-10M 20 6.JAVA池 不小于20M 20 7.Streams池 20 8.软件代码区: 20 9.程序全局区(PGA) 20 四. 实例的进程结构(实例=SGA + 后台进程) 20 1.DBWR (数据库写入进程) 21 2.LGWR(日志写入进程) 22 3.ARCH(归档进程)-可选进程 22 4.CKPT(检查点进程)-可选进程 22 5.SMON (系统监控进程) 22 6.PMON (进程监控进程) 22 7.RECO (恢复进程) 22 8. Dnnn (调度进程)-可选进程(略) 22 五. 数据字典 22 第三讲 用户、模式和表 24 一. 用户和模式 24 1.模式 24 2.模式对象 24 3.用户 24 (1)创建用户 24 (2)授权 24 (3)删除用户及该模式下对象 26 二. 表 26 1. 数据类型 26 (1)字符型 26 (2)数值型 26 (3)日期时间型 26 (4)LOB (大型对象) 26 (5)RowID (伪列类型) 27 2. 创建表 27 (1)Create Table 表名 27 (2)在原来已有表上建一个新表(结构和数据) 27 (3)使用OEM建表 27 3.默认值和NULL值 27 三. 修改表 28 四. 删除表 28 五. 数据完整性 28 1.Primary Key 约束 28 2.NOT NULL约束 29 3.Unique 约束 29 4.Foreign Key 约束 29 5.Check约束 (最复杂)列级 | 表级 29 第四讲 SQL基本查询 31 一. SQL语句概述 31 1. SQL简介 31 2. SQL分类 31 3. PL/SQL (Procedure Language) 31 二. SQL*Plus 31 1.启动 SQL*Plus 单行编辑 31 2.启动iSQL*Plus 多行编辑 31 3.退出 32  直接关闭 32  输入:Exit 或 quit 32 三. 本书所使用的示例模式 32 1.Vendition:销售管理系统(11个表)(略) 32 2. School:学生成绩管理系统(6个表) 32 四. SQL SELECT语句 34 1.Select语句的格式 34 2.Select … From … ——选择列(投影) 35 3.Where子句——选择行(选择)数据过滤 35 4.Order By子句 35 5.统计函数——列名应指定别名 35 6. Group By分组 36 7.Having子句 36 8.练习:表的查询 36 五. 在SQL *Plus中使用函数 37 1.字符串函数 37 2.数字函数 37 3.日期时间函数 38 4.转换函数 38 第五讲 修改SQL数据与SQL*Plus命令 40 一.添加数据 40 1.Insert Into 表名 [ 字段列表 ] Values (值) 40 2.向表中插入空值 40 3.从其它表中拷贝数据 40 二. 更新数据 41 三. 删除数据 42 1.Delete 语句 42 2.Truncate 语句 42 四. SQL*Plus命令 42 1.设置环境变量命令 42 (1)Pause 43 (2)pagesize 和 newpage 43 (3)linesize 43
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧