牛腩购物: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所示。
图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所示。
下面是我自己写的一个 获取产品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