• 牛腩购物:22 产品内容页制作 获取客户端ip,产品上一件,下一件,cte的简单使用


    获取客户端的IP:  string ip = Request.UserHostAddress;    

    上一件,下一件产品 用到一个函数  row_number    详情查看:http://www.cnblogs.com/1727050508/archive/2012/04/01/2428318.html

      row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number 函数的用法如下面的SQL语句所示:

    select row_number() over(order by field1) as row_number,* fromt_table

      上面的SQL语句的查询结果如图2所示。

    image

      图2

      其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。

      实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示

    select row_number() over(order by field2 desc) as row_number,*from t_table order by field1 desc

      上面的SQL语句的查询结果如图3所示。

    image

    下面是我自己写的一个  获取产品ID上一件,下一件的存储过程。

     

    先放一个错误的存储过程,我也没有弄懂为什么就错了,不过反正就是错滴·· 

     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		Joey
    -- Create date: 2012-04-01  愚人节快乐
    -- Description:	判断上一件,下一件产品的ID
    -- =============================================
    alter proc pooc_PrevOrNextPro 
    	-- Add the parameters for the stored procedure here
    	@proid int,--商品ID
    	@str nvarchar(50)--上一件为prev  下一件为next
    	 
    AS
    BEGIN
    
    --由于用了cte,而cte后面只能接select update delete 所以这里不能用if,只有放到最上面用if来判断是prev/next
    	if @str='prev'  --如果是上
    	begin
    		with pro  --cte表达式
    			as 
    			(
    					--先把行号rowid 求出来,放到一张临时表pro表
    				select ROW_NUMBER() over (order by  createdate desc) as rowid,* from shop_product
    			 
    			)
    			,
    			proRowid   --多个cte  用逗号隔开
    			as (
    					--然后我们通过传入的产品id,和刚才的临时表来获取临时表的行号,放到临时表proRowid
    				select rowid from pro where id=@proid
    				)
    					--最后,回到最先的临时表pro,通过两张表的行号来取得一个记录
    			 select a.* from pro a,proRowid b  where  a.rowid=b.rowid-1
    		  end
    	else if @str='next'
    		begin
    			with pro
    			as 
    			(
    				select ROW_NUMBER() over (order by  createdate) as rowid,* from shop_product
    			 
    			)
    			,
    			proRowid
    			as (
    				select rowid from pro where id=@proid
    				)
    			 select * from pro a,proRowid b  where  a.rowid=b.rowid+1
    		end
     
    END
    GO
    

    再放一个正确的存储过程

     

    USE
    [niunanshop] GO /****** Object: StoredProcedure [dbo].[pooc_PrevOrNextPro] Script Date: 04/07/2012 09:20:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Joey -- Create date: 2012-04-01 愚?人?节?快?乐? -- Description: 判断上一件,下一件产品的ID
    -- =============================================
    ALTER proc [dbo].[pooc_PrevOrNextPro] -- Add the parameters for the stored procedure here @proid int,--商品ID @str nvarchar(50)--上一件为 prev  下一件为 next
    AS BEGIN declare @rowid int --先获取原来的行号 select @rowid=rowid from(select ROW_NUMBER() over (order by createdate) as rowid,* from shop_product) as a where a.id=@proid if @str='prev' --根据是上一个还是下一个来修改行号 set @rowid=@rowid-1 else set @rowid=@rowid+1 --根据修改了之后的行号来获取对应的行 select * from (select ROW_NUMBER() over (order by createdate) as rowid,* from shop_product ) as b where b.rowid=@rowid END
  • 相关阅读:
    layer-list:Android中layer-list使用详解
    Nexus6p:正在下载系统更新,没有进度
    转:浅谈char类型范围
    C/C++/Java中的volatile关键字
    C++中的mutable关键字
    C++中的typedef typename 作用
    C++中的友元函数和友元类
    用flashfxp做ftp镜像同步
    python读取caffemodel文件
    py-faster-rcnn几个辅助脚本
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2428998.html
Copyright © 2020-2023  润新知