高级自定义查询、分页、多表联合存储过程

本文介绍了一种通过存储过程和动态SQL实现复杂查询分页的方法,有效减少了查询语句的数量,显著提升了系统的运行效率。
分页存储过程代码如下:
None.gifALTER PROCEDURE [dbo].[Task_SelectPagedAndSorted] 
None.gif(
None.gif    
@ProjectID uniqueidentifier,
None.gif    
@ProjectAreaID uniqueidentifier,
None.gif    
@DepartmentID uniqueidentifier,
None.gif    
@ChiefID uniqueidentifier,
None.gif    
@State nvarchar(32),
None.gif    
@Priority int,
None.gif    
@Triage nvarchar(32),
None.gif    
@PlanStartDateF datetime,
None.gif    
@PlanStartDateL datetime,
None.gif    
@PlanEndDateF datetime
None.gif    
@PlanEndDateL datetime
None.gif    
@CompletedDateF datetime,
None.gif    
@CompletedDateL datetime,
None.gif    
@SortExpression nvarchar(256),
None.gif    
@StartRowIndex int,
None.gif    
@MaximumRows int
None.gif)    
None.gif
AS
None.gif
None.gif
DECLARE @sql nvarchar(4000)
None.gif
DECLARE @ViewSql nvarchar(4000)
None.gif
DECLARE @WhereClause nvarchar(2000)
None.gif
DeCLARE @FEndRowIndex int
None.gif
DeCLARE @FStartRowIndex int
None.gif
DeCLARE @FMaximumRows int
None.gif
DeCLARE @FSortExpression nvarchar(256)
None.gif
None.gif
-- Make sure a @sortExpression is specified
None.gif
IF LEN(@SortExpression> 0
None.gif  
SET @FSortExpression = @SortExpression
None.gif
ELSE
None.gif  
SET @FSortExpression = 'ChangedDate DESC'
None.gif
None.gif
if (@StartRowIndex is null)
None.gif  
SET @FStartRowIndex = 0;
None.gif
else
None.gif  
SET @FStartRowIndex = @StartRowIndex
None.gif
if (@MaximumRows is nullor (@MaximumRows <= 0)
None.gif  
SET @FMaximumRows = 1000;
None.gif
else
None.gif  
SET @FMaximumRows = @MaximumRows 
None.gif
None.gif
SET @FEndRowIndex = @FStartRowIndex + @FMaximumRows
None.gif
None.gif
SET @WhereClause = 'WHERE --'
None.gif
if not ((@ProjectID is nullor (@ProjectID = '00000000-0000-0000-0000-000000000000'))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ProjectID] = 
''' + CAST(@ProjectID as nvarchar(64)) + ''')'
None.gif
if not ((@ProjectAreaID is nullor (@ProjectAreaID = '00000000-0000-0000-0000-000000000000'))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ProjectAreaID] = 
''' + CAST(@ProjectAreaID as nvarchar(64)) + ''')'
None.gif
if not ((@DepartmentID is nullor (@DepartmentID = '00000000-0000-0000-0000-000000000000'))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([DepartmentID] = 
''' + CAST(@DepartmentID as nvarchar(64)) + ''')'
None.gif
if not ((@ChiefID is nullor (@ChiefID = '00000000-0000-0000-0000-000000000000'))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ChiefID] = 
''' + CAST(@ChiefID as nvarchar(64)) + ''')'
None.gif
if  LEN(@State> 0
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([State] = 
''' + @State + ''')'
None.gif
if not ((@Priority is nullor (@Priority < 0))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([Priority] = 
' + CONVERT(nvarchar(10), @Priority+ ')'
None.gif
if  LEN(@Triage> 0
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([Triage] = 
''' + @Triage + ''')'
None.gif
if not (@PlanStartDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanStartDate] is null) or ([PlanStartDate] >= CAST(
''' + CAST(@PlanStartDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanStartDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanStartDate] is null) or ([PlanStartDate] <= CAST(
''' + CAST(@PlanStartDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanEndDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanEndDate] is null) or ([PlanEndDate] >= CAST(
''' + CAST(@PlanEndDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanEndDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanEndDate] is null) or ([PlanEndDate] <= CAST(
''' + CAST(@PlanEndDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@CompletedDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([CompletedDate] is null) or ([CompletedDate] >= CAST(
''' + CAST(@CompletedDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@CompletedDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([CompletedDate] is null) or ([CompletedDate] <= CAST(
''' + CAST(@CompletedDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if (@WhereClause = 'WHERE --')
None.gif  
SET @WhereClause = ''
None.gif        
None.gif
SET @sql = '
None.gifSELECT 
None.gif  Task.[TaskID], 
None.gif  [TaskSQN], 
None.gif  [TaskName], 
None.gif  [DepartmentID], 
None.gif  [ChangerID], 
None.gif  [CreatedDate], 
None.gif    (SELECT FullName FROM dbo.UserInfo AS CreatorUser WHERE (dbo.Task.CreatorID = UserID)) AS 
None.gif  Creator,
None.gif  [CreatorID], 
None.gif  [Triage], 
None.gif    (SELECT DepartmentName FROM dbo.Department WHERE (dbo.Task.DepartmentID = DepartmentID)) AS 
None.gif  Department, 
None.gif  [ChiefID], 
None.gif    (SELECT FullName FROM dbo.UserInfo AS ChiefUser WHERE (dbo.Task.ChiefID = UserID)) AS 
None.gif  Chief, 
None.gif  [ProjectID], 
None.gif    (SELECT ProjectName FROM dbo.Project WHERE (dbo.Task.ProjectID = ProjectID)) AS 
None.gif  Project,
None.gif  [PlanEndDate], 
None.gif  [PlanStartDate], 
None.gif  [CompletedDate], 
None.gif  [Priority], 
None.gif  [State], 
None.gif  [WorkLoad], 
None.gif    (SELECT TaskName FROM dbo.Task AS ParentTask WHERE (dbo.Task.ParentID = TaskID)) AS 
None.gif  ParentTask,  
None.gif  [ParentID], 
None.gif    (SELECT ProjectAreaName FROM dbo.ProjectArea WHERE (dbo.Task.ProjectAreaID = ProjectAreaID)) AS 
None.gif  ProjectArea,
None.gif  [ProjectAreaID], 
None.gif  [Description], 
None.gif  [Rev], 
None.gif  [ChangedDate], 
None.gif    (SELECT FullName FROM dbo.UserInfo AS ChangerUser WHERE (dbo.Task.ChangerID = UserID)) AS 
None.gif  Changer  
None.gifFROM Task,    
None.gif    (SELECT 
None.gif      [TaskID],       
None.gif      ROW_NUMBER() OVER (ORDER BY 
' + @FSortExpression + ') AS RowRank 
None.gif    FROM [Task]  
None.gif    
' + @WhereClause + '
None.gif     ) AS RankTask
None.gifWHERE (Task.TaskID = RankTask.TaskID)
None.gif  AND (RankTask.RowRank >= 
' + CONVERT(nvarchar(10), @FStartRowIndex+ '
None.gif  AND (RankTask.RowRank < 
' + CONVERT(nvarchar(10), @FEndRowIndex+ ')
None.gif
'
None.gif
None.gif
SET @ViewSql = '
None.gifSELECT 
None.gif  ViewTask.[TaskID], 
None.gif  [TaskSQN], 
None.gif  [TaskName], 
None.gif  [DepartmentID], 
None.gif  [ChangerID], 
None.gif  [CreatedDate],   
None.gif  [Creator],
None.gif  [CreatorID], 
None.gif  [Triage],    
None.gif  [Department], 
None.gif  [ChiefID], 
None.gif  [Chief], 
None.gif  [ProjectID], 
None.gif  [Project],
None.gif  [PlanEndDate], 
None.gif  [PlanStartDate], 
None.gif  [CompletedDate], 
None.gif  [Priority], 
None.gif  [State], 
None.gif  [WorkLoad], 
None.gif  [ParentTask],  
None.gif  [ParentID], 
None.gif  [ProjectArea],
None.gif  [ProjectAreaID], 
None.gif  [Description], 
None.gif  [Rev], 
None.gif  [ChangedDate], 
None.gif  [Changer]  
None.gifFROM ViewTask,    
None.gif    (SELECT 
None.gif      [TaskID],       
None.gif      ROW_NUMBER() OVER (ORDER BY 
' + @FSortExpression + ') AS RowRank 
None.gif    FROM [Task]  
None.gif    
' + @WhereClause + '
None.gif     ) AS RankTask
None.gifWHERE (ViewTask.TaskID = RankTask.TaskID)
None.gif  AND (RankTask.RowRank >= 
' + CONVERT(nvarchar(10), @FStartRowIndex+ '
None.gif  AND (RankTask.RowRank < 
' + CONVERT(nvarchar(10), @FEndRowIndex+ ')
None.gif
' 
None.gif
None.gif
EXEC sp_executesql @sql      
None.gif
None.gif
RETURN 

计算Count代码如下:
None.gifALTER PROCEDURE dbo.Task_SelectPagedAndSortedCount 
None.gif(
None.gif    
@ProjectID uniqueidentifier,
None.gif    
@ProjectAreaID uniqueidentifier,
None.gif    
@DepartmentID uniqueidentifier,
None.gif    
@ChiefID uniqueidentifier,
None.gif    
@State nvarchar(32),
None.gif    
@Priority int,
None.gif    
@Triage nvarchar(32),
None.gif    
@PlanStartDateF datetime,
None.gif    
@PlanStartDateL datetime,
None.gif    
@PlanEndDateF datetime
None.gif    
@PlanEndDateL datetime
None.gif    
@CompletedDateF datetime,
None.gif    
@CompletedDateL datetime,
None.gif    
@Count int output
None.gif)    
None.gif
AS
None.gif
None.gif
DECLARE @sql nvarchar(4000)
None.gif
DECLARE @WhereClause nvarchar(2000)
None.gif
None.gif
SET @WhereClause = 'WHERE --'
None.gif
if not (@ProjectID is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ProjectID] = CAST(
''' + CAST(@ProjectID as nvarchar+ ''') AS uniqueidentifier)'
None.gif
if not (@ProjectAreaID is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ProjectAreaID] = CAST(
''' + CAST(@ProjectAreaID as nvarchar+ ''') AS uniqueidentifier)'
None.gif
if not (@DepartmentID is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([DepartmentID] = CAST(
''' + CAST(@DepartmentID as nvarchar+ ''') AS uniqueidentifier)'
None.gif
if not (@ChiefID is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([ChiefID] = CAST(
''' + CAST(@ChiefID as nvarchar+ ''') AS uniqueidentifier)'
None.gif
if  LEN(@State> 0
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([State] = 
''' + @State + ''')'
None.gif
if not ((@Priority is nullor (@Priority < 0))
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([Priority] = 
' + CONVERT(nvarchar(10), @Priority+ ')'
None.gif
if  LEN(@Triage> 0
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    ([Triage] = 
''' + @Triage + ''')'
None.gif
if not (@PlanStartDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanStartDate] is null) or ([PlanStartDate] >= CAST(
''' + CAST(@PlanStartDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanStartDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanStartDate] is null) or ([PlanStartDate] <= CAST(
''' + CAST(@PlanStartDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanEndDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanEndDate] is null) or ([PlanEndDate] >= CAST(
''' + CAST(@PlanEndDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@PlanEndDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([PlanEndDate] is null) or ([PlanEndDate] <= CAST(
''' + CAST(@PlanEndDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@CompletedDateF is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([CompletedDate] is null) or ([CompletedDate] >= CAST(
''' + CAST(@CompletedDateF as nvarchar)  + ''' AS datetime)))'
None.gif
if not (@CompletedDateL is null)
None.gif  
SET @WhereClause = @WhereClause + 'AND
None.gif    (([CompletedDate] is null) or ([CompletedDate] <= CAST(
''' + CAST(@CompletedDateL as nvarchar)  + ''' AS datetime)))'
None.gif
if (@WhereClause = 'WHERE --')
None.gif  
SET @WhereClause = ''
None.gif
None.gif
SET @sql = '(
None.gifSELECT 
None.gif  
' + @Count + ' = Count(*)
None.gifFROM [Task]  
None.gif    
' + @WhereClause + ')'
None.gif
None.gif
-- Execute the SQL query
None.gif
EXEC sp_executesql @sql
None.gif
None.gif
RETURN
None.gif

DataList代码如下:
None.gif<atlas:UpdatePanel ID="TaskListUpdatePanel" runat="server" Mode="Conditional">
None.gif      
<Triggers>
None.gif        
<atlas:ControlEventTrigger ControlID="TaskFiltButton" EventName="Click" />
None.gif        
<atlas:ControlEventTrigger ControlID="NewTaskFormView" EventName="ItemInserted" />
None.gif      
</Triggers>
None.gif      
<ContentTemplate>
None.gif        
<asp:DataList ID="TaskListDataList" runat="server" Width="100%" DataSourceID="TaskListDataSource">
None.gif          
<ItemTemplate>
ExpandedBlockStart.gifContractedBlock.gif            
<%dot.gif--<div class="DataListDate">
ExpandedBlockEnd.gif            
</div>--
%>
None.gif            
<div class="DataListItem">
None.gif              
<div class="DataListTitle">
ExpandedBlockStart.gifContractedBlock.gif                
<asp:HyperLink ID="TaskListDetailLink" runat="server" NavigateUrl='<%# Eval("TaskID", "~/ControlPanel/WorkItem/TaskDetail.aspx?TaskID={0}") %>' Text='<%dot.gifEval("TaskName"%>'>
None.gif                
</asp:HyperLink>
None.gif              
</div>
None.gif              
<div class="DataListStatus">
None.gif                
<asp:Label ID="PriorityLabel" runat="server" Text='<%# Eval("Priority") %>'></asp:Label>
None.gif                
&nbsp;|&nbsp;
None.gif                
<asp:Label ID="TaskListCompletedDateLabel" runat="server" Text='<%# Eval("CompletedDate", "{0:yyyy-MM-dd}") %>'></asp:Label>
None.gif                
&nbsp;|&nbsp;
None.gif                
<asp:Label ID="TaskListStateLabel" runat="server" Text='<%# Eval("State") %>'></asp:Label>
None.gif                
&nbsp;|&nbsp;
None.gif                
<asp:Label ID="TriageLabel" runat="server" Text='<%# Eval("Triage") %>'></asp:Label>
None.gif              
</div>
None.gif              
<div class="DataListBody">
None.gif                
<asp:Literal ID="TaskListDescriptionLiteral" runat="server" Text='<%# Eval("Description") %>'></asp:Literal>
None.gif              
</div>
None.gif              
<div class="DataListFoot">
ExpandedBlockStart.gifContractedBlock.gif                
<asp:HyperLink ID="TaskListDepartmentIDLink" runat="server" NavigateUrl='<%# Eval("DepartmentID", "~/ControlPanel/DepartmentManage.aspx?DepartmentID={0}") %>' Text='<%dot.gifEval("Department"%>'>
None.gif                
</asp:HyperLink>
None.gif                
&nbsp;|&nbsp;
ExpandedBlockStart.gifContractedBlock.gif                
<asp:HyperLink ID="TaskListChiefIDLink" runat="server" NavigateUrl='<%# Eval("ChiefID", "~/ControlPanel/DepartmentManage.aspx?UserID={0}") %>' Text='<%dot.gifEval("Chief"%>'>
None.gif                
</asp:HyperLink>
None.gif                
&nbsp;|&nbsp;
ExpandedBlockStart.gifContractedBlock.gif                
<asp:HyperLink ID="TaskListProjectIDLink" runat="server" NavigateUrl='<%# Eval("ProjectID", "~/ControlPanel/ProjectManage.aspx?ProjectID={0}") %>' Text='<%dot.gifEval("Project"%>'>
None.gif                
</asp:HyperLink>
None.gif                
&nbsp;|&nbsp;
ExpandedBlockStart.gifContractedBlock.gif                
<asp:HyperLink ID="TaskListProjectAreaIDLink" runat="server" NavigateUrl='<%# Eval("ProjectAreaID", "~/ControlPanel/ProjectManage.aspx?ProjectAreaID={0}") %>' Text='<%dot.gifEval("ProjectArea"%>'>
None.gif                
</asp:HyperLink>
ExpandedBlockStart.gifContractedBlock.gif                
<%dot.gif--&nbsp;|&nbsp;
InBlock.gif                
<asp:HyperLink ID="TaskListParentIDLink" runat="server" NavigateUrl='<%# Eval("ParentID", "~/TaskDetail.aspx?TaskID={0}") %>' Text='<%# Eval("Parent.TaskName") %>'>
ExpandedBlockEnd.gif
                </asp:HyperLink>--
%>
None.gif                
&nbsp;|&nbsp;
None.gif                
<asp:Label ID="TaskListPlanStartDatePlanEndDateLabel" runat="server" Text='<%# "(" + Eval("PlanStartDate", "{0:yyyy-MM-dd}") + "~" + Eval("PlanEndDate", "{0:yyyy-MM-dd}") + ")" %>'></asp:Label>
None.gif              
</div>
None.gif              
<div class="DataListVersion">
None.gif                
<%= Resources.Resource.Creator + ""%>
None.gif                
<asp:Label ID="CreatorLabel" runat="server" Text='<%# Eval("Creator") %>'></asp:Label>
None.gif                
<asp:Label ID="CreatedDateLabel" runat="server" Text='<%# Eval("CreatedDate", "{0:yyyy-MM-dd hh:mm:ss}") %>'></asp:Label>
None.gif                
&nbsp;|&nbsp;
None.gif                
<%= Resources.Resource.Changer + ""%>
None.gif                
<asp:Label ID="ChangerLabel" runat="server" Text='<%# Eval("Changer") %>'></asp:Label>
None.gif                
<asp:Label ID="ChangedDateLabel" runat="server" Text='<%# Eval("ChangedDate", "{0:yyyy-MM-dd hh:mm:ss}") %>'></asp:Label>
None.gif              
</div>
None.gif            
</div>
None.gif          
</ItemTemplate>
None.gif        
</asp:DataList>
None.gif        
<asp:ObjectDataSource ID="TaskListDataSource" runat="server" DataObjectTypeName="AIO.WITDB.WITDataObject" SelectMethod="ReadPagedAndSorted" TypeName="AIO.WITDB.WITDataObject">
None.gif          
<SelectParameters>
None.gif            
<asp:ControlParameter ControlID="TaskFiltProjectList" Name="projectID" PropertyName="SelectedValue" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltProjectAreaTextBox" Name="projectAreaID" PropertyName="Value" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltDepartmentTextbox" Name="departmentID" PropertyName="Value" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltChiefList" Name="ChiefID" PropertyName="SelectedValue" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltStateSelectOptionDropDownList" Name="state" PropertyName="SelectOptionItem" Type="String" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltPrioritySelectOptionDropDownList" Name="priority" PropertyName="SelectOptionItem" Type="String" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltTriageSelectOptionDropDownList" Name="triage" PropertyName="SelectOptionItem" Type="String" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltPlanStartDateFDateTextBox" Name="planStartDateF" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltPlanStartDateLDateTextBox" Name="planStartDateL" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltPlanEndDateFDateTextBox" Name="planEndDateF" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltPlanEndDateLDateTextBox" Name="planEndDateL" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltCompletedDateFDateTextBox" Name="completedDateF" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:ControlParameter ControlID="TaskFiltCompletedDateLDateTextBox" Name="completedDateL" PropertyName="Text" Type="DateTime" />
None.gif            
<asp:Parameter ConvertEmptyStringToNull="True" DefaultValue="" Name="sortExpression" Type="String" />
None.gif            
<asp:Parameter ConvertEmptyStringToNull="True" DefaultValue="0" Name="startRowIndex" />
None.gif            
<asp:Parameter ConvertEmptyStringToNull="True" DefaultValue="20" Name="maximumRows" />
None.gif          
</SelectParameters>
None.gif        
</asp:ObjectDataSource>
None.gif      
</ContentTemplate>
None.gif    
</atlas:UpdatePanel>


        本来系统采用BLinq实现、因为有复杂的逻辑关系、在业务层联合会产生大量的查询语句(大概200~200个)、现在采用存储过程调用动态SQL效率大大提高了。希望会对朋友有所帮助和借鉴

转载于:https://www.cnblogs.com/Bolik/archive/2006/08/24/485647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值