MySQL教程 Oracle教程 其他相关教程 MS AccessMS SQL教程
返回首页

分页存储过程(五)在MS SQL Server中打造更加准确

时间:2010-06-12 14:39来源: 作者:编程狂 点击:
以前的分页我都是主子表join查询,然后会出现下面的记录形式,返回时一个数据集合 订单1 明细1.1 订单1 明细1.2 订单1 明细1.3 订单2 明细2.1 订单2 明细2.2 这样的话,就造成大量的数据

 以前的分页我都是主子表join查询,然后会出现下面的记录形式,返回时一个数据集合 泠云工作室

    订单1  明细1.1

  订单1  明细1.2

  订单1  明细1.3

  订单2  明细2.1

  订单2  明细2.2

 

copyright lyttzx.com

  这样的话,就造成大量的数据冗余,就是【订单1】的数据被重复多次从数据库读取。这次我尝试将他们分开返回,返回两个数据集合 泠云工作室

   泠云工作室

  订单集合 本文来自泠云天天在线

   本文来自泠云天天在线

  copyright lyttzx.com

 

泠云工作室

    订单1

  订单2

  订单3

 

本文来自泠云天天在线

  明细集合

内容来自泠云天天在线

  

泠云工作室

    明细1.1 

  明细1.2

  明细1.3

  明细2.1

  明细2.2

 

copyright lyttzx.com

   copyright lyttzx.com

  这样的结果不知道会不会有效率提升,还有待测试。但是数据量少了,联合的数据量也少了。以前需要联合整张订单表和整张明细表,现在首先将符合条件的订单找到,然后用符合条件的订单和明细表联合,直接查找符合条件的订单的明细,目标明确了。

本文来自泠云天天在线

  当然了,找到的符合条件的订单还是放在零时表中,然后用临时表和明细表进行inner join查询明细信息。

泠云工作室

  

本文来自泠云天天在线

代码
DECLARE @begintime DATETIME
SET @begintime= GETDATE() 泠云工作室

--查询代理人所在村的订单

--参数部分
DECLARE 
    
@PageIndex INT--指定页
    @PageSize INT--每页记录数
copyright lyttzx.com

    @TotalNumber INT--返回记录总数
    @AgentID VARCHAR(36), --代理人ID
    @GoodsName VARCHAR(50), 本文来自泠云天天在线
    
@OrderSeqNo VARCHAR(36),
    
@FarmerName VARCHAR(50),
    
@OrderStatus VARCHAR(6),
    
@CompanyName VARCHAR(100), 泠云工作室
    
@PlaceTimeStart DATETIME,
    
@PlaceTimeEnd DATETIME
--参数赋值
SET @PageIndex=11
SET @PageSize=10
copyright lyttzx.com

SET @AgentID='0ff6f6e1-a111-4523-bbd0-4ce28e8dda56'
SET @GoodsName=''
SET    @OrderSeqNo=''
SET    @FarmerName=''

本文来自泠云天天在线


SET    @OrderStatus=''
SET    @CompanyName=''
--    @PlaceTimeStart DATETIME,
--
    @PlaceTimeEnd DATETIME
--
临时变量定义
DECLARE @VillageID VARCHAR(36--村ID

lyttzx.com


SELECT @VillageID=ai.VillageID FROM AgentInfo ai WHERE ai.AgentID=@AgentID

--临时表#PurchaseDoc,仅用于存储查询出来的PurchaseDocID和农民Name
DECLARE @PurchaseDoc TABLE (
    PurchaseDocID 
VARCHAR(36),
lyttzx.com

    
[NAME] VARCHAR(50)
);
--查询指定村的购买单号和农民名字到#PurchaseDoc
INSERT INTO @PurchaseDoc(PurchaseDocID,[NAME])
SELECT pd.PurchaseDocID,pi1.[Name]
泠云工作室

  
FROM PurchaseDoc pd INNER JOIN PlanterInfo pi1
ON pd.PlanterID=pi1.PlanterID
WHERE pi1.VillageID=@VillageID

--获取记录总数,未设置查询条件
SELECT @TotalNumber=COUNT(*

本文来自泠云天天在线


FROM OrderInfo oi INNER JOIN @PurchaseDoc
ON oi.PurchaseDocID=[@PurchaseDoc].PurchaseDocID
AND [@PurchaseDoc].[NAME] LIKE '%'+@FarmerName+'%' lyttzx.com
INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID
AND oi.GoodsName LIKE '%'+@GoodsName+'%'
AND oi.OrderSeqNO LIKE '%'+@OrderSeqNo+'%'

内容来自泠云天天在线


AND ci.CompanyName LIKE '%'+@CompanyName+'%'
And oi.OrderStatus LIKE '%'+@OrderStatus+'%'

copyright lyttzx.com


AND (oi.PlaceTime BETWEEN ISNULL(@PlaceTimeStart,'1900-01-01'AND ISNULL(@PlaceTimeEnd,'9999-12-31'))
;
--定义并计算指定页首记录编号

泠云工作室


DECLARE @StartNumber INT,@TotalPages INT
SET @TotalPages=CEILING(@TotalNumber/@PageSize)
SET @StartNumber=

泠云工作室


    
CASE 
    
WHEN @PageIndex<=1 THEN 1
    
WHEN @PageIndex>@TotalPages THEN (@TotalPages-1)*@PageSize+1 本文来自泠云天天在线
    
ELSE (@PageIndex-1)*@PageSize+1
    
END;

--临时订单表
DECLARE @OrderInfo TABLE (
    OrderSeqNO 
VARCHAR(36),
lyttzx.com

    GoodsName 
VARCHAR(50),
    
--CompanyID VARCHAR(36),
    CompanyName VARCHAR(100),
    GoodsType 
VARCHAR(3),
    OrderAmount 
DECIMAL(12,2),
lyttzx.com

    PlaceTime 
DATETIME,
    DeliveryTime 
DATETIME,
    OrderStatus 
VARCHAR(6),
    PurchaseDocID 
VARCHAR(36),
    GoodsID 
VARCHAR(36)
); 

--查询当前页的订单信息到临时订单表
lyttzx.com

WITH cte AS (
    
SELECT ROW_NUMBER() OVER (ORDER BY oi.PlaceTime DESCAS RowNumber,
            oi.OrderSeqNO ,
            oi.GoodsName ,
            
--oi.CompanyID, 泠云工作室
            ci.CompanyName ,
            oi.GoodsType ,
            oi.OrderAmount ,
            oi.PlaceTime ,
            oi.DeliveryTime ,
            oi.OrderStatus,
            oi.PurchaseDocID,
            oi.GoodsID
    
FROM OrderInfo oi INNER JOIN @PurchaseDoc
本文来自泠云天天在线

    
ON oi.PurchaseDocID=[@PurchaseDoc].PurchaseDocID
    
AND [@PurchaseDoc].[NAME] LIKE '%'+@FarmerName+'%' lyttzx.com
    
INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID
    
AND oi.GoodsName LIKE '%'+@GoodsName+'%'
    
AND oi.OrderSeqNO LIKE '%'+@OrderSeqNo+'%'

lyttzx.com


    
AND ci.CompanyName LIKE '%'+@CompanyName+'%'
    
And oi.OrderStatus LIKE '%'+@OrderStatus+'%'

本文来自泠云天天在线


    
AND (oi.PlaceTime BETWEEN ISNULL(@PlaceTimeStart,'1900-01-01'AND ISNULL(@PlaceTimeEnd,'9999-12-31'))
)
INSERT INTO @OrderInfo
泠云工作室

SELECT cte.OrderSeqNO ,
        cte.GoodsName ,
        
--cte.CompanyID ,
        cte.CompanyName,
        cte.GoodsType ,
        cte.OrderAmount ,
        cte.PlaceTime ,
        cte.DeliveryTime ,
        cte.OrderStatus,
        cte.PurchaseDocID,
        cte.GoodsID  
FROM cte WHERE RowNumber BETWEEN @StartNumber AND (@StartNumber+@PageSize-1)

本文来自泠云天天在线



--获取用于显示的订单信息
SELECT oi.OrderSeqNO,
        oi.GoodsName,
        
--ci.CompanyName,
        oi.CompanyName,
        oi.GoodsType,
        oi.OrderAmount,
        oi.PlaceTime,
        oi.DeliveryTime,
        oi.OrderStatus,
        pd.
[NAME]  内容来自泠云天天在线
FROM @OrderInfo oi 
INNER JOIN @PurchaseDoc pd ON oi.PurchaseDocID=pd.PurchaseDocID
--INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID

--获取订单的详细信息
--
SELECT vpps.PkgAmount,vpps.UnitCnName,vpps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO 泠云工作室
--
  FROM OrderDetail od
--
INNER JOIN @OrderInfo oi ON od.OrderSeqNO=oi.OrderSeqNO
--
INNER JOIN View_ProductPkgSpec vpps ON od.GoodsID=vpps.PkgSpecID
SELECT sps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO
  
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='2'
泠云工作室

INNER JOIN SeedPkgSpec sps ON od.GoodsID=sps.SeedPkgSpecID
INNER JOIN Unit u ON sps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON sps.PkgSpecName=ps.PkgSpecCode lyttzx.com
UNION
SELECT pps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO 
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='3' 泠云工作室
INNER JOIN PesPkgSpec pps ON od.GoodsID=pps.PesPkgSpecID
INNER JOIN Unit u ON pps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON pps.PkgSpecName=ps.PkgSpecCode copyright lyttzx.com
UNION
SELECT fps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO 
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='4'
泠云工作室

INNER JOIN FertPkgSpec fps ON od.GoodsID=fps.FertPkgSpecID
INNER JOIN Unit u ON fps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON fps.PkgSpecName=ps.PkgSpecCode 泠云工作室

SELECT DATEDIFF(ms,@begintime,GETDATE())

  lyttzx.com

  copyright lyttzx.com

 

内容来自泠云天天在线

代码
DECLARE @begintime DATETIME
SET @begintime= GETDATE()
copyright lyttzx.com


--查询厂商订单,OrderStatus条件未设置

--参数部分
DECLARE 
    
@PageIndex INT--指定页
    @PageSize INT--每页记录数 内容来自泠云天天在线
    @TotalNumber INT--返回记录总数
    @CompanyID VARCHAR(36), --厂商ID
    @DisCode VARCHAR(12), 内容来自泠云天天在线
    
@GoodsName VARCHAR(50),
    
@GoodsType VARCHAR(3),
    
@OrderAmountStart DECIMAL(12,2),
    
@OrderAmountEnd DECIMAL(12,2), 泠云工作室
    
@PlaceTimeStart DATETIME,
    
@PlaceTimeEnd DATETIME
    
--@OrderStatus VARCHAR(6)
--
参数赋值
SET @PageIndex=110
SET @PageSize=10

copyright lyttzx.com


SET @CompanyID='22177BE9-AA3F-4F3C-ABDC-5AB2ECD50658'
SET @DisCode=''
SET @GoodsName=''
SET @GoodsType=''
泠云工作室

SET @OrderAmountStart=0
SET @OrderAmountEnd=9999999999.99

--去掉地域代码参数右侧为0的部分
SET @DisCode=
    
CASE 泠云工作室
        
WHEN @DisCode LIKE '__0000000000' THEN LEFT(@DisCode,2)
        
WHEN @DisCode LIKE '____00000000' THEN LEFT(@DisCode,4)
泠云工作室

        
WHEN @DisCode LIKE '______000000' THEN LEFT(@DisCode,6)
        
WHEN @DisCode LIKE '_________000' THEN LEFT(@DisCode,9) 泠云工作室
        
ELSE @DisCode
    
END;

--获取记录总数,未设置查询条件
SELECT @TotalNumber=COUNT(*FROM OrderInfo oi
INNER JOIN PurchaseDoc pd ON oi.PurchaseDocID=pd.PurchaseDocID
本文来自泠云天天在线

            
AND oi.CompanyID=@CompanyID
            
AND pd.DisCode LIKE @DisCode+'%'
            
AND oi.GoodsName LIKE '%'+@GoodsName+'%'
内容来自泠云天天在线

            
AND oi.GoodsType LIKE '%'+@GoodsType+'%'
            
AND oi.OrderAmount BETWEEN @OrderAmountStart AND @OrderAmountEnd 内容来自泠云天天在线
            
AND oi.PlaceTime BETWEEN ISNULL(@PlaceTimeStart,'1900-01-01'AND ISNULL(@PlaceTimeEnd,'9999-12-31')
--And (其他条件)oi.OrderStatus=

本文来自泠云天天在线



--定义并计算指定页首记录编号
DECLARE @StartNumber INT,@TotalPages INT
SET @TotalPages=CEILING(@TotalNumber/@PageSize)

lyttzx.com


SET @StartNumber=
    
CASE 
    
WHEN @PageIndex<=1 THEN 1
    
WHEN @PageIndex>@TotalPages THEN (@TotalPages-1)*@PageSize+1

内容来自泠云天天在线


    
ELSE (@PageIndex-1)*@PageSize+1
    
END;
--临时订单表    
DECLARE @OrderInfo TABLE ( 内容来自泠云天天在线
    OrderSeqNO 
VARCHAR(36),
    GoodsName 
VARCHAR(50),
    GoodsType 
VARCHAR(3),
    OrderAmount 
DECIMAL(12,2),
    PlaceTime 
DATETIME, 本文来自泠云天天在线
    Consignee 
VARCHAR(50),
    ConsigneeTel 
VARCHAR(20),
    PurchaseDocID 
VARCHAR(36),
    ArrivalTime 
DATETIME,
    ConsigneeAddress 
VARCHAR(200),
内容来自泠云天天在线

    PostCode 
VARCHAR(6)
);
--查询当前页的订单信息到临时订单表
WITH cte AS (
    
SELECT ROW_NUMBER() OVER (ORDER BY oi.PlaceTime ASCAS RowNumber,
copyright lyttzx.com

            oi.OrderSeqNO ,
            oi.GoodsName ,
            oi.GoodsType ,
            oi.OrderAmount ,
            oi.PlaceTime ,
            pd.Consignee ,
            pd.ConsigneeTel ,
            pd.PurchaseDocID,
            oi.ArrivalTime,
            pd.ConsigneeAddress,
            pd.PostCode
lyttzx.com

    
FROM OrderInfo oi 
    
INNER JOIN PurchaseDoc pd ON oi.PurchaseDocID=pd.PurchaseDocID
            
AND oi.CompanyID=@CompanyID
            
AND pd.DisCode LIKE @DisCode+'%' 泠云工作室
            
AND oi.GoodsName LIKE '%'+@GoodsName+'%'
            
AND oi.GoodsType LIKE '%'+@GoodsType+'%' lyttzx.com
            
AND oi.OrderAmount BETWEEN @OrderAmountStart AND @OrderAmountEnd
            
AND oi.PlaceTime BETWEEN ISNULL(@PlaceTimeStart,'1900-01-01'AND ISNULL(@PlaceTimeEnd,'9999-12-31') 本文来自泠云天天在线
    
--And (其他条件)oi.OrderStatus=
)
INSERT INTO @OrderInfo(
    OrderSeqNO,
    GoodsName ,
    GoodsType ,
    OrderAmount,
    PlaceTime,
    Consignee ,
    ConsigneeTel ,
    PurchaseDocID,
    ArrivalTime,
    ConsigneeAddress,
    PostCode
)
SELECT cte.OrderSeqNO, 内容来自泠云天天在线
    cte.GoodsName ,
    cte.GoodsType ,
    cte.OrderAmount,
    cte.PlaceTime,
    cte.Consignee ,
    cte.ConsigneeTel ,
    cte.PurchaseDocID,
    cte.ArrivalTime,
    cte.ConsigneeAddress,
    cte.PostCode 
FROM cte
WHERE cte.RowNumber BETWEEN @StartNumber AND (@StartNumber+@PageSize-1)
本文来自泠云天天在线


--获取订单信息
SELECT oi.* FROM @OrderInfo oi

--获取订单的详细信息
--
SELECT vpps.PkgAmount,vpps.UnitCnName,vpps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO
--
  FROM OrderDetail od
--
INNER JOIN @OrderInfo oi ON od.OrderSeqNO=oi.OrderSeqNO 泠云工作室
--
INNER JOIN View_ProductPkgSpec vpps ON od.GoodsID=vpps.PkgSpecID

SELECT sps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO
  
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='2'
copyright lyttzx.com

INNER JOIN SeedPkgSpec sps ON od.GoodsID=sps.SeedPkgSpecID
INNER JOIN Unit u ON sps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON sps.PkgSpecName=ps.PkgSpecCode 泠云工作室
UNION
SELECT pps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO 
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='3'

lyttzx.com


INNER JOIN PesPkgSpec pps ON od.GoodsID=pps.PesPkgSpecID
INNER JOIN Unit u ON pps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON pps.PkgSpecName=ps.PkgSpecCode 内容来自泠云天天在线
UNION
SELECT fps.PkgAmount,u.UnitCnName,ps.PkgSpecName,od.Qty,od.UnitPrice,od.OrderSeqNO 
FROM @OrderInfo oi 
INNER JOIN OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO AND oi.GoodsType='4' copyright lyttzx.com
INNER JOIN FertPkgSpec fps ON od.GoodsID=fps.FertPkgSpecID
INNER JOIN Unit u ON fps.Unit=u.UnitCode
INNER JOIN PkgSpec ps ON fps.PkgSpecName=ps.PkgSpecCode 泠云工作室

SELECT DATEDIFF(ms,@begintime,GETDATE())
(责任编辑:泠云)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
发布者资料
编程狂 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-10-07 08:10 最后登录:2010-09-08 15:09
推荐内容