【MSsqlserver】存储过程学习开始

大概在三年之前,自己有弄过存储过程,是在oracle的数据库上弄的。
现在项目在ms sql server上了。又有存储过程。
所以需要对这方面进行一个全方面的了解和学习。
1,最基础的存储过程。
从代码解析开始吧。

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetAllEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
SET NOCOUNT ON;
SELECT LastName, FirstName, Department
FROM HumanResources.vEmployeeDepartmentHistory;
GO


这个procedure是没有任何意义的。只是做为一个演示。
首先第一句为使用数据库。如果你一个数据库引擎上有多个数据库,那么这个必要的。
go语句之后是一个查询uspGetAllEmployees是否存在。
使用OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' )进行查询。而后面第二个参数为“P”,所表示的意思是查询procedure。

与oracle的不同。 oracle采用是CREATE OR REPLACE。
第二个才是procedure的开始。
他里面其实就是一个很简单的查询语句。

这个procedure既没有输入,也没有输出。

所以没有什么很大的含义。这个值作为一个入门来使用。


ms server 执行动态sql
传参为@tablename,我需要建立一个以传参名的table。
定义
declare @sql varchar(200)='create table '+@tablename+'(id int)'

然后使用
exec @sql

始终执行不成
原因是不能这样定义。
需要分开定义
如:
declare @sql varchar(200)
set @sql='create table'+@tablename+(id int)
exec @sql


这样才能执行成功。


[b]sysobjects中type字段类型解释:[/b]

C   =   CHECK   约束 
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程



数据库存储过程是不支持数组类型的,
如果说对方需要更新一个数组内的所有数据该怎么办呢“?
那么我们采用string到数组的方式,不过这里必须定义一个分割的符号,如“,”。
以下就是一个类似的存储过程
alter PROCEDURE testArray 
@ID nvarchar(500)
as
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1

while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
select @TId
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--删除最后一个,因为最后一个后面没有逗号,所以在循环中跳出,需另外再删除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)

select @TId
GO



存储过程是在网络上找的。 可以使用
执行方法:
exec testArray @ID='1,2,3,4,5,6,7,8,9'



-----------------------------------------------------------------
对于存储过程报错的问题。
如果你没有进行检测而去直接执行sql,那么会出现异常。
如果你可以获取这个异常信息,
当然我还是建议大家把异常进行捕获。


delcare @msg varchar(200)
delcare @MyError int=@@Error
select top 1 @msg = description from sys.sysmessages
where error = @MyError and msglangid = 2052 --中文描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值