SQL 书籍推荐(示例SQL 错误处理)

看过很多SQL入门的书籍, 最值得推荐的还是《MICROSOFT+SQL+SERVER+2008技术内幕:T-SQL语言基础》

看完上面那本, 并且在工作中实践了之后, 可以继续看《Microsoft SQL Server 2008技术内幕:T-SQL查询》

和另外一本《Inside_Microsoft_SQL_Server_2008_T-SQL_Programming 》,这本暂时没中文版。

下面是摘抄自本书的关于SQL错误处理的相关内容。

CREATE TABLE dbo.Employees
(
	empid INT NOT NULL,
	empname VARCHAR(25) NOT NULL,
	mgrid INT NULL,
	CONSTRAINT PK_Employees PRIMARY KEY(empid),
	CONSTRAINT CHK_Employees_empid CHECK(empid>0),
	CONSTRAINT FK_Employees
		FOREIGN KEY(mgrid) REFERENCES dbo.Employees(empid)
)


BEGIN TRY

	INSERT INTO dbo.Employees ( empid, empname, mgrid )
	VALUES  ( 1, 'emp1', NULL  );
END TRY
BEGIN CATCH
	IF ERROR_NUMBER()=2627
		PRINT '		Handling PK violation...';
	ELSE IF ERROR_NUMBER()=547
		PRINT '		Handling Check/FK constraint violation...';
	ELSE IF ERROR_NUMBER()=515
		PRINT '		Handling Null violation...';
	ELSE IF ERROR_NUMBER()=245
		PRINT '		Handling conversion error...';
	ELSE
		PRINT '		Handling Unknow error...';

	PRINT	'ERROR Number:' + CAST(ERROR_NUMBER() AS VARCHAR(10));
	PRINT	'ERROR Message:' + ERROR_MESSAGE();
	PRINT	'ERROR SEVERITY:' + CAST (ERROR_SEVERITY() AS VARCHAR(10));
	PRINT	'ERROR State: '+ CAST(ERROR_STATE() AS VARCHAR(10));
	PRINT	'ERROR LINE:'+ CAST (ERROR_LINE() AS VARCHAR(10));
	PRINT	'ERROR PROC:' + COALESCE(ERROR_PROCEDURE(),'Not within proc');

END CATCH;

/*
	当第二次运行上面这段代码时,INSERT 语句将会失败, 流程控制转移到CATCH块,会有以下的错误信息。
	要查看其它错误的效果,可以用0,'A', NULL作为雇员ID来运行这段代码。

(0 行受影响)
		Handling PK violation...
ERROR Number:2627
ERROR Message:违反了 PRIMARY KEY 约束“PK_Employees”。不能在对象“dbo.Employees”中插入重复键。重复键值为 (1)。
ERROR SEVERITY:14
ERROR State: 1
ERROR LINE:5
ERROR PROC:Not within proc

*/
	

IF OBJECT_ID('dbo.ups_use_err_message','P') IS NOT NULL
	DROP PROC dbo.ups_use_err_message;
GO

CREATE PROC dbo.ups_user_err_message
AS

	IF ERROR_NUMBER()=2627
		PRINT '		Handling PK violation...';
	ELSE IF ERROR_NUMBER()=547
		PRINT '		Handling Check/FK constraint violation...';
	ELSE IF ERROR_NUMBER()=515
		PRINT '		Handling Null violation...';
	ELSE IF ERROR_NUMBER()=245
		PRINT '		Handling conversion error...';
	ELSE
		PRINT '		Handling Unknow error...';

	PRINT	'ERROR Number:' + CAST(ERROR_NUMBER() AS VARCHAR(10));
	PRINT	'ERROR Message:' + ERROR_MESSAGE();
	PRINT	'ERROR SEVERITY:' + CAST (ERROR_SEVERITY() AS VARCHAR(10));
	PRINT	'ERROR State: '+ CAST(ERROR_STATE() AS VARCHAR(10));
	PRINT	'ERROR LINE:'+ CAST (ERROR_LINE() AS VARCHAR(10));
	PRINT	'ERROR PROC:' + COALESCE(ERROR_PROCEDURE(),'Not within proc');

GO

/*  
	现在上面的测试就可以直接调用处理错误的存储过程来处理了。
*/

BEGIN TRY

	INSERT INTO dbo.Employees ( empid, empname, mgrid )
	VALUES  ( 1, 'emp1', NULL  );
END TRY
BEGIN CATCH
	EXEC dbo.ups_user_err_message

END CATCH;

/*
  这样处理, 就可以只在数据库的一个地方对可重用的错误处理代码进行维护。
*/
--DROP TABLE dbo.Employees

  

原文地址:https://www.cnblogs.com/intheway/p/6795752.html