日度归档:2018年7月17日

mssql sqlserver2012 关键字throw用法简介


摘要:
下文讲述sqlserver 2012数据库中关键字throw用法说明及举例应用:
实验环境:sqlserver 2012



throw关键字简介

throw关键字应用于sqlserver 2012,功能类似raiserror抛出错误信息
throw语法说明 :

THROW [ { error_number | @local_variable },  
        { message | @local_variable },  
        { state | @local_variable } ]   
   [ ; ]

———–参数说明———————
error_number:
int类型,大于或等于50000,并且小于等于 2147483647
message:
错误信息
state:
消息的状态值,是一个介于0~255之间的常量

说明:
THROW 关键字前的语句必须加上分号 (;) 语句终止符。
如果throw未加入任何参数时,则改关键字必须包含在catch 语句块中
在throw关键字中,%号是保留关键字,如何存在%号字符,则需对其进行转义


throw关键字应用

BEGIN TRY
    SELECT 8/0
END TRY
BEGIN CATCH
    THROW 
END CATCH
---输出----
(0 行受影响)
消息 8134,级别 16,状态 1,第 25 行
遇到以零作除数错误。

mssql sqlserver in 关键字在值为null的应用举例


摘要:
下文通过案例分析in 关键字在值为null的应用举例,
分析出not in关键字在null值产生的异常信息
如下所示:

CREATE TABLE testA(keyId INT)
CREATE TABLE testB(keyId INT)
GO
INSERT INTO testA(keyId) VALUES (1)
INSERT INTO testA(keyId) VALUES (2)
INSERT INTO testA(keyId) VALUES (3)
GO
INSERT INTO testB(keyId) VALUES (1)
INSERT INTO testB(keyId) VALUES (2)
INSERT INTO testB(keyId) VALUES (4)
INSERT INTO testB(keyId) VALUES (NULL)
GO
 SELECT * FROM testA WHERE keyId IN (SELECT keyId FROM testB)
-----输出------
/*
keyId
1
2
*/
 SELECT * FROM testA WHERE keyId not IN (SELECT keyId FROM testB)
------无输出记录-----
/*
keyId
*/
INSERT INTO testA VALUES (NULL) ---在testA表中插入空值
SELECT * FROM testA WHERE EXISTS(
	SELECT null  FROM testB WHERE testA.keyId=testB.keyId	
)
----输出----
/*
keyId
1
2
*/
SELECT * FROM testA WHERE not  EXISTS(
	SELECT null  FROM testB WHERE testA.keyId=testB.keyId	
)
/*
keyId
3
NULL
*/
SELECT * FROM testA WHERE testA.keyId NOT in (
	SELECT testB.keyId FROM testB WHERE testB.keyId IS NOT NULL	
)

drop table testA
drop table testB


通过以上测试,我们可以看出not in 查询关键字如果子表中存在空值,则无法查询出任何记录,会导致异常产生,
需使用not exists获取相应的空值信息