Tsql T-SQL分页排序和筛选-筛选不起作用
T-SQL分页排序与筛选 我已经在一个T-SQL存储过程上工作了几个小时,它将使我能够检索一组分页的文章,这些文章根据指定的列按ASC或DESC顺序排序 我现在正在根据“Title”字段的第一个字符对存储过程进行筛选,并添加了以下行:Tsql T-SQL分页排序和筛选-筛选不起作用,tsql,sorting,filtering,paging,Tsql,Sorting,Filtering,Paging,T-SQL分页排序与筛选 我已经在一个T-SQL存储过程上工作了几个小时,它将使我能够检索一组分页的文章,这些文章根据指定的列按ASC或DESC顺序排序 我现在正在根据“Title”字段的第一个字符对存储过程进行筛选,并添加了以下行: @StartAlpha nvarchar(1) = null 及 见下文 存储过程不再返回任何结果。我真的不知道为什么 有人能帮忙吗 问候 沃尔特 USE [ABC] GO /****** Object: StoredProcedure [dbo].[Get_
@StartAlpha nvarchar(1) = null
及
见下文
存储过程不再返回任何结果。我真的不知道为什么
有人能帮忙吗
问候
沃尔特
USE [ABC]
GO
/****** Object: StoredProcedure [dbo].[Get_MyArticles_Paged] Script Date: 08/07/2011 20:41:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Get_MyArticles_Paged]
/*Paging Total For Output*/
@Row_Count BIGINT OUT,
/*Paging Inputs*/
@Page_Size INT = 10,
@Page_Number INT = 1,
@Sort_Column VARCHAR(100), /* ('articleid','createdate','title','subject') */
@Sort_Direction VARCHAR(4), /* ('ASC','DESC') */
@StartAlpha nvarchar(1) = null
AS
BEGIN
print @StartAlpha
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
/*========================================================================
Declare local variables
========================================================================*/
DECLARE @FirstRecord int
DECLARE @LastRecord int
-- create a temporary space for paged result set
DECLARE @PagedResults AS TABLE (
[ArticleID] INT,
[CreateDate] SMALLDATETIME,
[Title] VARCHAR(200),
[Subject] VARCHAR(500),
[Row_Number] BIGINT,
[Row_Count] BIGINT
);
/*========================
Normalize Paging Parameters
==========================*/
--Fix invalid input for Page Size
SET @Page_Size = CASE
WHEN @Page_Size IS NULL THEN 10
WHEN @Page_Size < 1 THEN 10
ELSE @Page_Size
END;
--Fix invalid input for Page Number
SET @Page_Number = CASE
WHEN @Page_Number IS NULL THEN 1
WHEN @Page_Number < 1 THEN 1
ELSE @Page_Number
END;
--starting record to use.
SET @FirstRecord = ((@Page_Number - 1) * @Page_Size) + 1
--last record to use.
SET @LastRecord = @FirstRecord + @Page_Size - 1
--ensure sort column is valid in the list
SET @Sort_Column = CASE
WHEN LOWER(@Sort_Column) IN ('articleid','createdate','title','subject')
THEN LOWER(@Sort_Column)
ELSE
'title' --default
END
--ensure sort direction is ASC or DESC
SET @Sort_Direction = CASE
WHEN LEFT(UPPER(COALESCE(@Sort_Direction, '')) + ' ', 4) = 'DESC'
THEN 'DESC' --explicit descending
WHEN @Sort_Column = 'created' AND LEFT(UPPER(COALESCE(@Sort_Direction,'')) + ' ', 3) <> 'ASC' THEN
'DESC' --default for created date
ELSE 'ASC' --default otherwise
END;
/*============
Prepare Results
==============*/
WITH [MyTempArea] AS (
SELECT TOP (@LastRecord)
[ArticleID],
[CreateDate],
[Title],
[Subject],
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='articleid' THEN [articleid] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='createdate' THEN [createdate] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='title' THEN [title] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='subject' THEN [subject] END END ASC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='articleid' THEN [articleid] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='createdate' THEN [createdate] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='title' THEN [title] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='subject' THEN [subject] END END DESC
) AS [Row_Number],
COUNT(*) OVER () AS [Row_Count]
FROM Articles
WHERE ((@StartAlpha IS NULL) OR (Title Like @StartAlpha + '%'))
)
INSERT INTO @PagedResults
SELECT * FROM [MyTempArea] WHERE [Row_Number] >= @FirstRecord;
/*===========
Return Results
=============*/
-- @Row_Count output param
SELECT @Row_Count = COALESCE(MAX(Row_Count), 0) FROM @PagedResults;
-- Paged results set to return
SELECT [ArticleID],[CreateDate],[Title],[Subject]
FROM @PagedResults
ORDER BY [Row_Number];
END
仅根据这些要求,我会这样做:
WHERE ((@StartAlpha IS NULL) OR (LEFT(Title, 1) = @StartAlpha))
当你只运行这个部分时,你会得到什么?还请说明在参数中使用的值
WITH [MyTempArea] AS (
SELECT TOP (@LastRecord)
[ArticleID],
[CreateDate],
[Title],
[Subject],
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='articleid' THEN [articleid] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='createdate' THEN [createdate] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='title' THEN [title] END END ASC,
CASE WHEN(@Sort_Direction = 'ASC') THEN CASE WHEN @Sort_Column='subject' THEN [subject] END END ASC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='articleid' THEN [articleid] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='createdate' THEN [createdate] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='title' THEN [title] END END DESC,
CASE WHEN(@Sort_Direction = 'DESC') THEN CASE WHEN @Sort_Column='subject' THEN [subject] END END DESC
) AS [Row_Number],
COUNT(*) OVER () AS [Row_Count]
FROM Articles
WHERE ((@StartAlpha IS NULL) OR (Title Like @StartAlpha + '%'))
)
SELECT * FROM [MyTempArea]
@Andreas LEFTTitle,1语法将比类似的比较执行得更好。。。但是使用类似的方法,这应该是可行的:
WHERE (Title Like isnull(@StartAlpha, '') + '%')
与空值一起工作会让我感到紧张。感谢所有提出有用建议的人 我完全重构了存储过程,现在它可以工作了。见下文 我不完全清楚为什么原始存储过程不能工作,为什么这个版本能工作,但我想我会与论坛分享 再次感谢 沃尔特 ALTER PROCEDURE [dbo].[Account_ContactGetData] @CurrentPage int = null, @PageSize int = null, @SortColumn nvarchar(max) = null, @SortDirection varchar(5), @StartAlpha nvarchar(1) = null WITH EXECUTE AS CALLER AS BEGIN SET NOCOUNT ON; DECLARE @FirstRecord int; DECLARE @LastRecord int; --starting record to use. SET @FirstRecord = ((@CurrentPage - 1) * @PageSize) + 1; --last record to use. SET @LastRecord = @FirstRecord + @PageSize - 1; with ContactCTE as ( SELECT [ContactID], [DisplayName], [FirstName], [MiddleName], [LastName], (ROW_NUMBER() OVER (Order By CASE WHEN @SortColumn='ContactID' AND @SortDirection='DESC' THEN ContactID END DESC, CASE WHEN @SortColumn='ContactID' AND @SortDirection='ASC' THEN ContactID END ASC, CASE WHEN @SortColumn='DisplayName' AND @SortDirection='DESC' THEN DisplayName END DESC, CASE WHEN @SortColumn='DisplayName' AND @SortDirection='ASC' THEN DisplayName END ASC, CASE WHEN @SortColumn='FirstName' AND @SortDirection='DESC' THEN FirstName END DESC, CASE WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN FirstName END ASC, CASE WHEN @SortColumn='MiddleName' AND @SortDirection='DESC' THEN MiddleName END DESC, CASE WHEN @SortColumn='MiddleName' AND @SortDirection='ASC' THEN MiddleName END ASC, CASE WHEN @SortColumn='LastName' AND @SortDirection='DESC' THEN LastName END DESC, CASE WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN LastName END ASC )) AS Row FROM Contact WHERE ((@StartAlpha is NULL) OR (LastName Like @StartAlpha+ '%')) ) SELECT [ContactID], [DisplayName], [FirstName], [MiddleName], [LastName] FROM ContactCTE WHERE Row BETWEEN @FirstRecord AND @LastRecord END
谢谢你,安德烈亚斯。我试过了,但还是不行。当我这样做时:从LEFTTitle所在的文章中选择*,1='d'它起作用。我的CTE一定出了问题。@Walter当您只在CTE中运行查询时,是否得到任何行?是的。我得到所有返回的行。@您的查询正在执行[MyTempArea]中的SELECT*,其中[Row_Number]>=@FirstRecord;,但在您的示例代码@FirstRecord为空?@Andreas。。。设置@FirstRecord=@页码-1*@页码大小+1?就在SPB里,你能保证除了那两行之外你什么都没改吗?删除它们并确保获得结果。乍一看,这两行似乎都没有任何问题。是的,山姆。通过删除这些行,我将返回所有行。 ALTER PROCEDURE [dbo].[Account_ContactGetData] @CurrentPage int = null, @PageSize int = null, @SortColumn nvarchar(max) = null, @SortDirection varchar(5), @StartAlpha nvarchar(1) = null WITH EXECUTE AS CALLER AS BEGIN SET NOCOUNT ON; DECLARE @FirstRecord int; DECLARE @LastRecord int; --starting record to use. SET @FirstRecord = ((@CurrentPage - 1) * @PageSize) + 1; --last record to use. SET @LastRecord = @FirstRecord + @PageSize - 1; with ContactCTE as ( SELECT [ContactID], [DisplayName], [FirstName], [MiddleName], [LastName], (ROW_NUMBER() OVER (Order By CASE WHEN @SortColumn='ContactID' AND @SortDirection='DESC' THEN ContactID END DESC, CASE WHEN @SortColumn='ContactID' AND @SortDirection='ASC' THEN ContactID END ASC, CASE WHEN @SortColumn='DisplayName' AND @SortDirection='DESC' THEN DisplayName END DESC, CASE WHEN @SortColumn='DisplayName' AND @SortDirection='ASC' THEN DisplayName END ASC, CASE WHEN @SortColumn='FirstName' AND @SortDirection='DESC' THEN FirstName END DESC, CASE WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN FirstName END ASC, CASE WHEN @SortColumn='MiddleName' AND @SortDirection='DESC' THEN MiddleName END DESC, CASE WHEN @SortColumn='MiddleName' AND @SortDirection='ASC' THEN MiddleName END ASC, CASE WHEN @SortColumn='LastName' AND @SortDirection='DESC' THEN LastName END DESC, CASE WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN LastName END ASC )) AS Row FROM Contact WHERE ((@StartAlpha is NULL) OR (LastName Like @StartAlpha+ '%')) ) SELECT [ContactID], [DisplayName], [FirstName], [MiddleName], [LastName] FROM ContactCTE WHERE Row BETWEEN @FirstRecord AND @LastRecord END