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

来自: 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 对象吧。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值