概述  

 最近因为业务的需求写了一段时间存储过程,发现之前写的存储过程存在一些不严谨的地方,特别是TRY…CATCH中嵌套事务的写法;虽然之前写的并没有错,但是还是埋藏着很大的隐患在里面。希望这篇文章能给大家一些参考;文章内容有点长还望耐心阅读。

 

 

       
若发现sqlsrver所有帐号不小心被禁用了,这个时候怎么办?用重装吗?不用,仔细看小白是怎么一步一步解开这个谜题的。
首先需要Windows帐号设置里重新添加一个新帐号。并将其添加到管理员组里面,然后按照以下步骤操作(注意/m是切换到单用户的登录模式下进行,修改完成后,建议切换到多用户模式下):
(1)到Sqlserver的“配置工具》SQL Server
配置管理器”下,选择“Sql
Serve服务”展开,停止所有的sql服务
(2)用管理员身份运行cmd.exe,执行以下命令:
     net stop
sqlserver实例名(可以在Sql Serve服务下选择SQL
Server(…)右键属性里找到)
     net start sqlserver实例名
/m(可以在Sql Serve服务下选择SQL Server(…)右键属性里找到)
(3)接下来执行sqlcmd命令(不清楚怎么用的,可以百度sqlcmd的用法),按照一下顺序输入,并回车执行。
     create login kk with
password=’kk#12345′;
     go
     sp_addsrvrolemember ‘kk’,
‘sysadmin’
     go
(4)重复执行(2)并将/m去掉。成功之后,并可以使用kk帐号登录,然后启用自己想要帐号

[20171106]修改show spparameter的显示宽度.txt

1.插入测试数据

----创建表
DROP TABLE score
GO
CREATE TABLE [dbo].[score](
    id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(50) NOT NULL,
    score INT NOT NULL CHECK (score>=0),
    months INT NOT NULL,
    createtime DATETIME NOT NULL DEFAULT GETDATE()
)

---根据姓名月份查询分数
CREATE INDEX IX_score_name ON score(name,months) include(score)
---根据月份查询最高分数
CREATE INDEX IX_score_months ON score(months) include(name,score)
---创建姓名和月份组合的唯一索引
CREATE UNIQUE INDEX IX_score_months_name ON score(months,name)

------插入测试数据
TRUNCATE TABLE score

INSERT INTO score(name,score,months) 
VALUES('li',50,10),('chen',70,10),('zhang',80,10),('wang',90,10),('li',50,11),('chen',70,11),('zhang',80,11),('wang',90,11)

SELECT * FROM score;

图片 1

–//很多年前做的,修改show parameter的显示宽度.
–//链接: [20121023]改变show
parameter的显示宽度.txt=>

2.THROW

THROW是在2012版本中引入的,在有些场景当中,应用程序端不做一些合法性的验证,这些验证会被放在数据库端来验证。当数据库端验证输入的信息不合法时需要主动抛出异常来中断代码的执行。

THROW既可以接收错误信息抛错提示,同时也可以手动抛出错误到CATCH中。语法如下:

;THROW

THROW [ { error_number | @local_variable }, 

        { message | @local_variable }, 

        { state | @local_variable } ]  

[ ; ]

参数

error_number
表示异常的常量或变量。 error_number是int并且必须为大于或等于 50000 且小于或等于 2147483647,如果CATCH中使用RAISERROR来接收错误信息那么指定的error_number必须在sys.messages 中存在;如果使用CATCH来接收则不需要。

消息
描述异常的字符串或变量。 消息是nvarchar(2048)。

状态
在 0 到 255 之间的常量或变量,指示与消息关联的状态。 状态是tinyint。

注意:

1.THROW代码前必须要用分号,因为THROW会中断代码的执行,所以如果将THROW放在CATCH中时必须放在ROLLBACK
TRAN之后,否则不会回滚事务导致对象一直处于提交状态被锁。

2.THROW放CATCH中可以达到RAISERROR一样的效果,同时还简便了代码。

  1. THROW能返回正确的错误代码行号,而RAISERROR没办法

参考:

–//今天发现show
spparameter显示宽度也不是很合理,修改看看,并做一个记录:

3.sp_addmessage

自定义错误号

EXEC sp_addmessage  
    @msgnum = 60000,  
    @severity = 16,  
    @msgtext = N'Manual cast wrong ',
    @lang = 'us_english'; 

EXEC sp_addmessage  
    @msgnum = 60000,  
    @severity = 16,  
    @msgtext = N'手动抛错',  
    @lang = '简体中文';

注意:自定义错误号必须大于50000

1.环境:
SYS@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER

调用存储过程


1.查询存储过程

----查询存储过程
CREATE PROCEDURE  Pro_score
(@Option VARCHAR(50),
 @name VARCHAR(50)='',
 @months INT=''
)
AS
BEGIN

---查询指定人分数
IF @Option='GetScore'
   BEGIN
        SELECT name,
               score
        FROM score
        WHERE name=@name

   END

----查询指定月份最高分数
IF @Option='MonthMaxScore'
   BEGIN
        SELECT Top 1 
             name,
             score
        FROM score
        WHERE months=@months
        ORDER BY score

   END



END

调用存储过程:

EXEC Pro_score @Option='GetScore',@name='li'
EXEC Pro_score @Option='MonthMaxScore',@months=11

图片 2


发表评论

电子邮件地址不会被公开。 必填项已用*标注