转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Sql Server >> 正文
SQL Server联机丛书:存储过程及其创建         

SQL Server联机丛书:存储过程及其创建

作者:闵涛 文章来源:闵涛的学习笔记 点击数:3111 更新时间:2007/11/14 12:59:12
,则使用预设的默认值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects 
      WHERE name = ''''au_info2'''' AND type = ''''P'''')
   DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
   @lastname varchar(30) = ''''D%'''',
   @firstname varchar(18) = ''''%''''
AS 
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON t.title_id = ta.title_id INNER JOIN publishers p
   ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
   AND au_lname LIKE @lastname
GO

au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:

EXECUTE au_info2
-- Or
EXECUTE au_info2 ''''Wh%''''
-- Or
EXECUTE au_info2 @firstname = ''''A%''''
-- Or
EXECUTE au_info2 ''''[CK]ars[OE]n''''
-- Or
EXECUTE au_info2 ''''Hunter'''', ''''Sheryl''''
-- Or
EXECUTE au_info2 ''''H%'''', ''''S%''''
D. 使用 OUTPUT 参数

OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。

首先,创建过程:

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = ''''titles_sum'''' AND type = ''''P'''')
   DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = ''''%'''', @@SUM money OUTPUT
AS
SELECT ''''Title Name'''' = title
FROM titles 
WHERE title LIKE @@TITLE 
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO

接下来,将该 OUTPUT 参数用于控制流语言。

说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。

参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。

DECLARE @@TOTALCOST money
EXECUTE titles_sum ''''The%'''', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200 
BEGIN
   PRINT '''' ''''
   PRINT ''''All of these titles can be purchased for less than $200.''''
END
ELSE
   SELECT ''''The total cost of these titles is $'''' 
         + RTRIM(CAST(@@TOTALCOST AS varchar(20)))

下面是结果集:

Title Name                                                               
------------------------------------------------------------------------ 
The Busy Executive''''s Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking

(3 row(s) affected)

Warning, null value eliminated from aggregate.
 
All of these titles can be purchased for less than $200.
E. 使用 OUTPUT 游标参数

OUTPUT 游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。

首先,创建以下过程,在 titles 表上声明并打开一个游标:

USE pubs
IF EXISTS (SELECT name FROM sysobjects 
      WHERE name = ''''titles_cursor'''' and type = ''''P'''')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT *
FROM titles

OPEN @titles_cursor
GO

接下来,执行一个批处理,声明一个局部游标变量,执行上述过程以将游标赋值给局部变量,然后从该游标提取行。

USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
   FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. 使用 WITH RECOMPILE 选项

如果为过程提供的参数不是典型的参数,并且新的执行计划不应高速缓存或存储在内存中,WITH RECOMPILE 子句会很有帮助。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = ''''titles_by_author'''' AND type = ''''P'''')
   DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = ''''%''''
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + '''' '''' + RTRIM(au_lname) AS ''''Authors full name'''',
   title AS Title
FROM authors a INNER JOIN titleauthor ta 
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. 使用 WITH ENCRYPTION 选项

WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = ''''encrypt_this'''' AND type = ''''P'''')
   DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT * 
FROM authors
GO

EXEC sp_helptext encrypt_this

下面是结果集:

The object''''s comments have been encrypted.

接下来,选择加密存储过程内容的标识号和文本。

SELECT c.id, c.text 
FROM syscomments c INNER JOIN sysobjects o
   ON c.id = o.id
WHERE o.name = ''''encrypt_this''''

下面是结果集:

说明  text 列的输出显示在单独一行中。执行时,该信息将与 id 列信息出现在同一行中。

id         text                                                        
---------- ------------------------------------------------------------
1413580074 ?????????????????????????????????e?????????????????????????????????????????

(1 row(s) affected)
H. 创建用户定义的系统存储过程

下面的示例创建一个过程,显示表名以 emp 开头的所有表及其对应的索引。如果没有指定参数,该过程将返回表名以 sys 开头的所有表(及索引)。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = ''''sp_showindexes'''' AND type = ''''P'''')
   DROP PROCEDURE sp_showindexes
GO
USE master
GO
CREATE PROCEDURE sp_showindexes
   @@TABLE varchar(30) = ''''sys%''''
AS 
SELECT o.name AS TABLE_NAME,
   i.name AS INDEX_NAME, 
   indid AS INDEX_ID
FROM sysindexes i INNER JOIN sysobjects o
   ON o.id = i.id 
WHERE o.name LIKE @@TABLE
GO         
USE pubs
EXEC sp_showindexes ''''emp%''''
GO

下面是结果集:

TABLE_NAME       INDEX_NAME       INDEX_ID 
---------------- ---------------- ----------------
employee         employee_ind     1
employee         PK_emp_id        2

(2 row(s) affected)
I. 使用延迟名称解析

下面的示例显示四个过程以及延迟名称解析的各种可能使用方式。尽管引用的表或列在编译时不存在,但每个存储过程都可创建。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = ''''proc1'''' AND type = ''''P'''')
   DROP PROCEDURE proc1
GO
-- Creating a procedure on a nonexistent table.
USE pubs
GO
CREATE PROCEDURE proc1
AS
   SELECT *
   FROM does_not_exist
GO  
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c 
   ON o.id = c.id
WHERE o.type = ''''P'''' AND o.name = ''''proc1''''
GO
USE master
GO
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = ''''proc2'''' AND type = ''''P'''')
   DROP PROCEDURE proc2
GO
-- Creating a procedure that attempts to retrieve information from a
-- nonexistent column in an existing table.
USE pubs
GO
CREATE PROCEDURE proc2
AS
   DECLARE @middle_init char(1)
   SET @middle_init = NULL
   SELECT au_id, middle_initial = @middle_init
   FROM authors
GO  
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c 
   ON o.id = c.id
WHERE o.type = ''''P'''' and o.name = ''''proc2''''
转自: http://goaler.xicp.net/ShowLog.asp?ID=515

上一页  [1] [2] [3] 


[Access]sql随机抽取记录  [Access]ASP&SQL让select查询结果随机排序的实现方法
[聊天工具]企业邮件系统的利器----FoxMail Server  [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜
[系统软件]SQL语句性能优化--LECCO SQL Expert  [系统软件]关于Windows2000Server的灾难恢复
[常用软件][网络]下载服务革命性风暴Poco Server评测  [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信…
[C语言系列]SQL Server到DB2连接服务器的实现  [C语言系列]SQL Server到SYBASE连接服务器的实现
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台