注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我只是一个人

我爱一个人

 
 
 

日志

 
 

sql存储过程,和子查询一届join的简单使用和介绍(二)  

2011-04-15 22:20:45|  分类: 网页制作--技巧| |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在本文中,此示例标准蓝图的存储过程命名方法只适用于SQL内部,假如你正在创建一个新的存储过程,或是发现一个没有按照这个标准构造的存储过程,即可以参考使用这个标准。

注释:假如存储过程以sp_ 为前缀开始命名那么会运行的稍微的缓慢,这是因为SQL Server将首先查找系统存储过程,所以我们决不推荐使用sp_作为前缀。

存储过程的命名有这个的语法:

 

[proc] [MainTableName] By [FieldName(optional)] [Action]

 

[ 1  ]  [ 2 ]      [ 3 ]  [ 4 ]


   
(1)
所有的存储过程必须有前缀'proc'. 所有的系统存储过程都有前缀"sp_", 推荐不使用这样的前缀因为会稍微的减慢。

(2) 表名就是存储过程访问的对象。

(3) 可选字段名就是条件子句。 例如:

procClientByCoNameSelect, procClientByClientIDSelect

(4) 最后的行为动词就是存储过程要执行的任务。

如果存储过程返回一条记录那么后缀是:Select

如果存储过程插入数据那么后缀是:Insert

如果存储过程更新数据那么后缀是:Update

如果存储过程有插入和更新那么后缀是:Save

如果存储过程删除数据那么后缀是:Delete

如果存储过程更新表中的数据 (ie. drop and create) 那么后缀是:Create

如果存储过程返回输出参数或0,那么后缀是:Output 

例子:

一个仅仅返回一个输出参数的存储过程:

ALTER PROCEDURE procClientRateOutput

         @pstrClientID VARCHAR(6) = 'CABLE',

         @pstrCategoryID VARCHAR(6) = '<All>',

         @pstrEmpID VARCHAR(6)='AC',

         @pdteDate datetime = '1996/1/1',

         @curRate MONEY OUTPUT

 

AS

 

-- Description: Get the $Rate for this client and this employee

--         and this category from Table ClientRate

 

SET @curRate = (

                SELECT TOP 1 Rate

                FROM ClientRate

                WHERE ClientID=@pstrClientID

                AND EmpID=@pstrEmpID

                AND CategoryID=@pstrCategoryID

                AND DateEnd > @pdteDate

                ORDER BY DateEnd

               )

 

IF @curRate IS NULL

 

         SET @curRate =

(

                SELECT TOP 1 Rate

                FROM ClientRate

                WHERE ClientID=@pstrClientID

                AND EmpID=@pstrEmpID

                AND CategoryID='<ALL>'

                AND DateEnd > @pdteDate

                ORDER BY DateEnd

               )

 

RETURN

从前的写法:

  Select 'procGetRate' or 'sp_GetRate'

  Insert 'procEmailMergeAdd'

目前的写法:

  'procClientRateSelect'

  'procEmailMergeInsert'

本文从多个角度阐述了SQL Server与存储过程的比较。

为什么要使用存储过程?

因为它比SQL语句执行快。

存储过程是什么?

把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句。

来一个最简单的存储过程:

CREATE PROCEDURE dbo.testProcedure_AX

AS

select userID from

 USERS order by userid desc

:dbo.testProcedure_AX是你创建的存储过程名,可以改为:AXzhz,别跟关键字冲突就行了.AS下面就是一条SQL语句,不会写SQL语句的请回避。

怎么在ASP.NET中调用这个存储过程:

public static string GetCustomerCName

(ref ArrayList arrayCName,ref ArrayList arrayID)

        {

            SqlConnection con=ADConnection.createConnection();

            SqlCommand cmd=new SqlCommand("testProcedure_AX",con);

            cmd.CommandType=CommandType.StoredProcedure;

            con.Open();

            try

            {

                SqlDataReader dr=cmd.ExecuteReader();

                while(dr.Read())

                {

                    if(dr[0].ToString()=="")

                    {

                        arrayCName.Add(dr[1].ToString());

                    }

                }

                con.Close();

                return "OK!";

            }

            catch(Exception ex)

            {

                con.Close();

                return ex.ToString();

            }

        }

:其实就是把以前:

SqlCommand cmd=new SqlCommand("select

userID from USERS order by userid desc",con)

中的SQL语句替换为存储过程名,再把cmd的类型标注为CommandType.StoredProcedure(存储过程)

写个带参数的存储过程:

CREATE PROCEDURE dbo.AXzhz

/*

这里写注释

*/

@startDate varchar(16),

@endDate varchar(16)

AS

 select id  from table_AX where commentDateTime>

@startDate and commentDateTime<@endDate order

by contentownerid DESC

:@startDate varchar(16)是声明@startDate 这个变量,多个变量名间用【,】隔开.后面的SQL就可以使用这个变量了。

我怎么在ASP.NET中调用这个带参数的存储过程:

public static string GetCustomerCNameCount

(string startDate,string endDate,ref DataSet ds)

{

            SqlConnection con=ADConnection.createConnection();

//-----------------------注意这一段-------------------

--------------------------------------------------------

-----------------------------

            SqlDataAdapter da=new SqlDataAdapter("AXzhz",con);

 

            para0=new SqlParameter("@startDate",startDate);

            para1=new SqlParameter("@endDate",endDate);

            da.SelectCommand.Parameters.Add(para0);

            da.SelectCommand.Parameters.Add(para1);

            da.SelectCommand.CommandType=CommandType.StoredProcedure;

//-------------------------------------------------------------

------------------------------------------------------------------

 

 

            try

            {

                con.Open();

                da.Fill(ds);

                con.Close();

                return "OK";

            }

            catch(Exception ex)

            {

                return ex.ToString();

            }           

        }

:把命令的参数添加进去,就可以了。

重新验证SQL命令执行是否成功。

CREATE PROCEDURE dbo.AXzhz

/*

  @parameter1 用户名

  @parameter2 新密码

*/

@password nvarchar(20),

@userName nvarchar(20)

AS

declare @err0 int

update WL_user set password=@password where UserName=@userName

set @err0=@@error

select  @err0 as err0

:先声明一个整型变量@err0,再给其赋值为@@error(这个是系统自动给出的语句是否执行成功,0为成功,其它为失败),最后通过select把它选择出来。

那怎么从后台获得这个执行成功与否的值:

下面这段代码可以告诉你答案:

public static string GetCustomerCName()

        {

            SqlConnection con=ADConnection.createConnection();

           

            SqlCommand cmd=new SqlCommand("AXzhz",con);

            cmd.CommandType=CommandType.StoredProcedure;

            para0=new SqlParameter("@startDate","2006-9-10");

            para1=new SqlParameter("@endDate","2006-9-20");

            da.SelectCommand.Parameters.Add(para0);

            da.SelectCommand.Parameters.Add(para1);

            con.Open();

            try

            {

               Int32 re=(int32)cmd.ExecuteScalar();

                con.Close();

                if (re==0)

                 return "OK!";

                else

                 return "false";

            }

            catch(Exception ex)

            {

                con.Close();

                return ex.ToString();

            }

        }

:就是通过SqlCommandExecuteScalar()方法取回这个值。

我要根据传入的参数判断执行哪条SQL语句:

ALTER PROCEDURE dbo.selectCustomerCNameCount

@customerID int

AS

if @customerID=-1

 begin

 select contentownerid ,userCName,count(*)

as countAll from view_usercomment group by

contentownerid,userCName order by contentownerid DESC

 end

else

 begin

 select contentownerid ,userCName,count(*)

as countAll from view_usercomment where

contentownerid=@customerID group by contentownerid

,userCName order by contentownerid DESC

 end

  评论这张
 
阅读(166)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017