看过很多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