Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql T-SQL分页排序和筛选-筛选不起作用_Tsql_Sorting_Filtering_Paging - Fatal编程技术网

Tsql T-SQL分页排序和筛选-筛选不起作用

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_

T-SQL分页排序与筛选

我已经在一个T-SQL存储过程上工作了几个小时,它将使我能够检索一组分页的文章,这些文章根据指定的列按ASC或DESC顺序排序

我现在正在根据“Title”字段的第一个字符对存储过程进行筛选,并添加了以下行:

@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