牛腩购物: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
原文地址:https://www.cnblogs.com/iceicebaby/p/2428998.html