MSSQL

mac2026-06-09  12

目录

存储过程 创建修改错误处理 1.RAISERROR 2.TRY … CATCH

3.存储过程

在创建C/S或B/S1应用程序时,可通过两种方式与服务器交互数据。一是将数据检索程序存储在客户端,通过客户端向服务器发送SQL语句来返回处理结果;另一种是将多个SQL语句组成一个事务处理过程,存储在服务器中,客户端像执行一条SQL语句一样调用该过程。

存储过程是经过编译后存储在服务器上的,减少了执行所需的传输代宽和时间;安全机制,可以授权用户具有某个存储过程的权限。

用户自定义存储过程

SQL存储过程CLR(Common Language Runtime,公共语言运行时)存储过程 是对Microsoft .NET Framework公共语言运行时方法的引用,可以接收和返加用户提供的参数。是一种托管代码,需要.NET Framework的支持。

系统存储过程 sp_开头。

注:下为SQL存储过程,CLR略。

3.1 创建

据内存不同,存储过程最大可以是128M。最多有2100个参数。

命名:未指定架构默认dbo架构;如与系统过程相同,则始终执行系统过程。建议:1.避免使用sp_开头;2.使用显示架构(还能改善名称解析性能)补充查找顺序:若是批处理或动态SQL中调用存储过程,会继续在调用该存储过程的用户的默认架构中寻找;若是其它存储过程调用,则在所用存储过程的myschma中寻找;若都找不到,最后到dbo架构中查找。 -- 不带参 SELECT * FROM dbo.voc GO CREATE PROC proc_voc AS SELECT * FROM dbo.voc GO EXEC proc_voc -- 执行

-- 带参 IF OBJECT_ID('dbo.proc_voc') IS NOT NULL DROP PROC dbo.proc_voc GO CREATE PROC dbo.proc_voc @item varchar(10) AS SELECT * FROM dbo.voc WHERE item = @item GO EXEC proc_voc 'Chair' -- 参数指定默认值 IF OBJECT_ID('dbo.proc_voc') IS NOT NULL DROP PROC dbo.proc_voc GO CREATE PROC dbo.proc_voc @item varchar(10), @color varchar(10) = 'red' -- 如未指定,则默认为'red' AS SELECT * FROM dbo.voc WHERE item = @item AND color = @color GO EXEC proc_voc 'Chair' -- 字符型参数,可用通配符 ALTER PROC dbo.proc_voc @item varchar(10), @color varchar(10) = 'r%' AS SELECT * FROM dbo.voc WHERE item LIKE @item AND color LIKE @color GO EXEC dbo.proc_voc 'C%' -- 带输出 ALTER PROC dbo.proc_voc @cnt int OUTPUT, @item varchar(10), @color varchar(10) = 'r%' -- 默认值参数位置 AS SELECT * FROM dbo.voc WHERE item LIKE @item AND color LIKE @color SET @cnt = (SELECT COUNT(1) FROM dbo.voc) GO DECLARE @cnt int EXEC dbo.proc_voc @cnt OUTPUT, 'C%' SELECT @cnt GO -- 输出参数中使用cursor类型 ALTER PROC dbo.proc_voc -- 声明变量 -- cursor参数类型只能用于输出,必须参数后必须使用VARYING OUTPUT -- 所有带cursor VARYING OUTPUT的存储过和不能通过OLE DB,ODBC,ADO,DB-Library调用 @lis_cursor cursor VARYING OUTPUT, @item varchar(10), @color varchar(10) = 'r%' AS BEGIN SET @lis_cursor = CURSOR LOCAL SCROLL FOR -- 声明、赋值游标变量 SELECT item , color , quantity FROM dbo.voc WHERE color LIKE @color AND item = @item -- 为了能将游标的值传递出去,结束时必须打开游标 OPEN @lis_cursor END GO DECLARE @my_cursor cursor EXEC dbo.proc_voc @my_cursor OUTPUT, 'yizi' IF CURSOR_STATUS('variable', '@my_cursor') <= 0 PRINT N'游标读取失败' ELSE BEGIN SELECT 1 -- OPEN打开的情况下,只进游标:返回当前行至游标最后一行 -- 可滚动游标:返回结果集所有行 FETCH NEXT FROM @my_cursor WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @my_cursor END END CLOSE @my_cursor DEALLOCATE @my_cursor GO

3.2 修改

删除或重建存储过程时,与该存储过程相关联的所有权限都消失。修改不会影响。

重新编译 当添加了索引、更改了索引列中的数据等时,应重新编译原始的查询计划。 -- 指定下次执行时重新编译 EXEC sp_recompile N'proc_x' -- 仅对需要重新编译的存储过程的【语句】进行重新编译 CREATE PROC proc_x AS SELECT * FROM T1 OPTION(RECOMPILE) -- 每次 recompile -- 每次都重新编译:存储过程 CREATE PROC proc_x WITH RECOMPILE -- 每次 AS SELECT * FROM T1

3.3 错误处理

RAISERROR USE tt GO SELECT * FROM dbo.voc GO -- item color quantity -- Chair red 1 -- Chair blue 2 -- Chair red 3 -- yizi red 1 -- yizi blue 6 CREATE PROC dbo.proc_test AS SELECT * FROM dbo.voc GO ALTER PROC dbo.proc_test @it varchar(20) AS IF (@it <> 'yizi') AND (@it <> 'Chair') BEGIN RAISERROR('无效输入:%s', 12, 1, @it) RETURN END SELECT * FROM dbo.voc --OPTION(RECOMPILE) WHERE quantity = @it GO EXEC dbo.proc_test 'y' GO -- Msg 50000, Level 12, State 1, Procedure proc_test, Line 29 -- 无效输入:y --DROP PROC dbo.proc_voc TRY … CATCH USE tt GO IF OBJECT_ID('dbo.proc_error', 'P') IS NOT NULL DROP PROC dbo.proc_error GO CREATE PROC dbo.proc_error AS -- IF ERROR_NUMBER() IS NULL -- RETURN -- 如无错误直接返回 SELECT ERROR_NUMBER() AS ErrorNumber, -- 错误编号 ERROR_SEVERITY() AS ErrorServerity, -- 严重级别 ERROR_STATE() AS ErrorState, -- 错误状态号 ERROR_PROCEDURE() AS ErrorProc, -- 错误存储过程/触发器 ERROR_LINE() AS ErrorLine, -- 错误例程中的行号 ERROR_MESSAGE() AS ErrorMessage -- 错误信息 GO BEGIN TRY SELECT 1/0 END TRY BEGIN CATCH -- SELECT ERROR_NUMBER() AS ErrorNumber EXEC dbo.proc_error END CATCH GO -- 8134 16 1 NULL 2 Divide by zero error encountered.

3.4 嵌套存储过程 递归;略


C/S:Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势 B/S:(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。 ↩︎

最新回复(0)