您的位置:首页 > 数据库

SQL IF..ELSE..在存储过程的使用规范

2012-05-13 13:15 363 查看

来自:
http://hi.baidu.com/%B5%AD%CB%AE%B5%AD%CB%AE/blog/item/bc4938b5a95ae4678ad4b266.html

分类:SQL存储过程

(

@city nvarchar(20),

@town nvarchar(20),

@village nvarchar(20)

)

as

declare @num numeric(10)

declare @yd_num numeric(10)

declare @lt_num numeric(10)

declare @gh_num numeric(10)

declare @xlt_num numeric(10)

select @num=count(jmzh) from jfxd.t_gongan_end_2

if @city='aaa'

begin

select @yd_num=count(jmzh) from jfxd.t_gongan_end_2 where SERIAL_NUMBER is notnull

select @lt_num=count(jmzh) from jfxd.t_gongan_end_2 where unicom is not null

select @gh_num=count(jmzh) from jfxd.t_gongan_end_2 where tel is not null

select @xlt_num=count(jmzh) from jfxd.t_gongan_end_2 where little_tel is notnull

end

else if @town='bbb'

begin

//sql语句

end

else

begin

//sql语句

end

update t_stat_info set……

GO 存储过程人门

字号 [大中小]

分类:SQL存储过程 |
标签:beck716.chaokuai.com

课程目标:
一、TRUNCATE
二、Select INTO
建表

把一个表中的数据复制到另外一个表中。
三、Insert INTO Select
四、补充:临时表

临时表存储在系统数据库tempdb中

临时表会被系统隐式地丢弃
---------------------------------------------------------
五、存储过程(**)
一、简介:

   存储过程(Stored Procedure),是一组为了完成特定功能的SQL
语句,集经编译后

存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行
它,

在SQL Server
的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程


系统SP,主要存储master
数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取

信息,从而为系统管理员管理SQL Server。用户自定义存储过程是由用户创建,并能完成

某一特定功能,如:查询用户所需数据信息的存储过程。

  存储过程具有以下优点

1.存储过程允许标准组件式编程(模块化设计)

存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而
且数

据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代
码只包含存

储过程的调用语句,从而极大地提高了程序的可移植性。

2.存储过程能够实现快速的执行速度

   如果某一操作包含大量的Transaction-SQL
代码,,或分别被多次执行,那么存储过程要比批处理


执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进
行分析优

化,并给出最终被存在系统表中的执行计划,而批处理的Transaction-SQL
语句在每次运行时
都要进行

编译和优化,因此速度相对要慢一些。

3.存储过程能够减少网络流量

   对于同一个针对数据数据库对象的操作,如查询修改,如果这一操作所涉及到的Transaction-SQL

语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调
用语句,否

则将是多条SQL
语句从而大大增加了网络流量降低网络负载。

4.存储过程可被作为一种安全机制来充分利用

   系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的


制。

二、变量
@I
三、流程控制语句(if else | select case | while )

Select ... CASE 实例

DECLARE @iRet INT, @PKDisp VARCHAR(20)

SET @iRet = '1'

Select @iRet =

CASE

WHEN @PKDisp = '一' THEN 1

WHEN @PKDisp = '二' THEN 2

WHEN @PKDisp = '三' THEN 3

WHEN @PKDisp = '四' THEN 4

WHEN @PKDisp = '五' THEN 5

ELSE 100

END
四、存储过程格式

创建存储过程

Create Proc dbo.存储过程名

存储过程参数

AS

执行语句

RETURN

执行存储过程

GO

*********************************************************/

-- 变量的声明,sql里面声明变量时必须在变量前加@符号

DECLARE @I INT
-- 变量的赋值,变量赋值时变量前必须加set

SET @I = 30
-- 声明多个变量

DECLARE @s varchar(10),@a INT
-- Sql
里if语句

IF 条件 BEGIN

执行语句

END

ELSE BEGIN

执行语句

END

DECLARE @d INT

set @d = 1
IF @d = 1 BEGIN
-- 打印

PRINT '正确'

END

ELSE BEGIN

PRINT '错误'

END

-- Sql 里的多条件选择语句.

DECLARE @iRet INT, @PKDisp VARCHAR(20)

SET @iRet = 1

Select @iRet =

CASE

WHEN @PKDisp = '一' THEN 1

WHEN @PKDisp = '二' THEN 2

WHEN @PKDisp = '三' THEN 3

WHEN @PKDisp = '四' THEN 4

WHEN @PKDisp = '五' THEN 5

ELSE 100

END
-- 循环语句

WHILE 条件 BEGIN

执行语句

END
DECLARE @i INT

SET @i = 1

WHILE @i<1000000 BEGIN

set @i=@i+1

END

-- 打印

PRINT @i

-- TRUNCATE 删除表中的所有行,而不记录单个行删除操作,不能带条件

TRUNCATE TABLE authors
-- Select INTO
从一个查询的计算结果中创建一个新表。数据并不返回给客户端,这一点和普通的

-- Select 不同。新表的字段具有和 Select
的输出字段相关联(相同)的名字和数据类型。

select * into NewTable

from Uname

-- Insert INTO Select

-- 表ABC必须存在

-- 把表Uname里面的字段Username复制到表ABC

Insert INTO ABC Select Username FROM Uname
-- 创建临时表

Create TABLE #temp(

UID int identity(1, 1) PRIMARY KEY,

UserName varchar(16),

Pwd varchar(50),

Age smallint,

Sex varchar(6)

)

-- 打开临时表

Select * from #temp
-- 存储过程

-- 要创建存储过程的数据库

Use Test

-- 判断要创建的存储过程名是否存在

if Exists(Select name From sysobjects Where And
type='P')

-- 删除存储过程

Drop Procedure dbo.csp_AddInfo

Go

-- 创建存储过程

Create Proc dbo.csp_AddInfo

-- 存储过程参数

@UserName varchar(16),

@Pwd varchar(50),

@Age smallint,

@Sex varchar(6)

AS

-- 存储过程语句体

insert into Uname (UserName,Pwd,Age,Sex)

values (@UserName,@Pwd,@Age,@Sex)

RETURN

-- 执行

GO

-- 执行存储过程

EXEC csp_AddInfo 'Junn.A','123456',20,'男'

sql server中翻页存储过程:

Create PROC blog_GetPagedPosts

(

@PageIndex int,

@PageSize int,

@BlogID int=0,

@PostType int=-1,

@CategoryID int=-1,

@Hiding bit =0,

@Count int output

)

as

DECLARE @PageLowerBound int

DECLARE @PageUpperBound int

SET @PageLowerBound = @PageSize * @PageIndex - @PageSize

SET @PageUpperBound = @PageLowerBound + @PageSize + 1
Create Table #IDs

(

TempID int IDENTITY (1, 1) NOT NULL,

EntryID int not null

)

Insert into #IDs(EntryID) select DISTINCT [ID] from view_Content whereCategoryID=@CategoryID and blogID=@BlogID order by [ID] desc

SELECT vc.*

FROM View_Content vc

INNER JOIN #IDS tmp ON (vc .[ID] = tmp.EntryID)

WHERE tmp.TempID > @PageLowerBound

AND tmp.TempID < @PageUpperBound and vc.Hiding=0

ORDER BY tmp.TempID

SELECT @Count=COUNT(*) FROM #IDS

SELECT @Count=COUNT(*) FROM #IDS

DROP TABLE #IDS

return @Count

GO
在Access中由于不支持存储过程,不能建立临时表只能在程序中实现

Access中实现如下,这也是我在myblog Access版中使用的:

public List<DayBook> GetPagedPost(PagedPost p, out int TotalRecords)

{

List<DayBook> list = new List<DayBook>();
using (OleDbConnection conn = GetOleDbConnection())

{

StringBuilder sql = new StringBuilder();

sql.AppendFormat("select [ID] from blog_Content as p ");//构造查询条件

if (p.CategoryID > 0)

{

sql.AppendFormat(",blog_Categories AS c, blog_Links AS l WHEREc.CategoryID=l.CategoryID and (p.ID=l.PostID ) and c.CategoryID={1} andp.BlogID={0} ",p.BlogID, p.CategoryID);

}

else

{

sql.AppendFormat(" where p.blogID={0} ", p.BlogID);

}

if (p.PostType != PostType.Undeclared)

{

sql.AppendFormat(" and p.PostType={0} ", (int)p.PostType);

}

sql.Append(" order by p.[DateUpdated] desc");

// NetDiskContext.Current.Context.Response.Write(sql.ToString());

//NetDiskContext.Current.Context.Response.End();

OleDbCommand MyComm = new OleDbCommand(sql.ToString(), conn);

List<int> IDs = new List<int>(); //获取主题ID列表

conn.Open();

using (OleDbDataReader dr = MyComm.ExecuteReader())

{

while (dr.Read())

{

IDs.Add((int)dr[0]);

}

}

TotalRecords=IDs.Count;//返回记录总数

if (TotalRecords < 1)

return list;

int pageLowerBound = p.PageSize * p.PageIndex - p.PageSize;//记录索引

int pageUpperBound = pageLowerBound + p.PageSize ;

StringBuilder sb = new StringBuilder();

if (TotalRecords >= pageLowerBound)

for (int i = pageLowerBound; i < TotalRecords && i <pageUpperBound; i++)

{

sb.AppendFormat("{0},", IDs[i]);//构造ID in()
条件,取其中一页

}

else return list; //如没有记录返回空表

if(sb.Length>1)

sb.Remove(sb.Length - 1, 1);//删除最后一个逗号

MyComm.CommandText = string.Format("SELECT b.* , c.Account as Account FROMblog_Content b, Blog_Config c where b.BlogID=c.BlogID and b.[ID] in ({0}) orderby b.dateadded desc", sb.ToString());

using (OleDbDataReader dr = MyComm.ExecuteReader())

{

while (dr.Read())

{

list.Add(DataHelp.LoadDayBook(dr));

}

}

return list;

}

}

存储过程.chaokuai.com

 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL
Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:

  第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。

  第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。

  第三、有利于SQL语句的重用。

  在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类:

1. 只返回单一记录集的存储过程

  假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):

CREATE PROCEDURE dbo.delUserAll

as

set nocount on

begin

delete from dbo.[userinfo]

end

go

  该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集:

'**通过Command对象调用存储过程**

DIM MyComm

Set MyComm = Server.CreateObject("ADODB.Command")

MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串

MyComm.CommandText = "delUserAll" '指定存储过程名

MyComm.CommandType = 4 '表明这是一个存储过程

MyComm.Prepared = true '要求将SQL命令先行编译

MyComm.Execute '此处不必再取得记录集

Set MyComm = Nothing

  当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: