日期:2014-05-18  浏览次数:20487 次

存储过程中如果递归匹配检索出大分类和子分类下的文章!哪位大哥帮忙下,万分感谢
SQL code

/**
 * 根据符合条件查询文章数据
 @vType 视图类别,1为大类文章视图vNewsMST,2为专题文章视图vSpecMST
 @SortID 
 @SpecID 
 @GroupsID 
 @NewsTitle 
 @CreateDateBegin 
 @CreateDateEnd 
 */
ALTER PROCEDURE [dbo].[NewsListSelectByCondition]
    (
    @vType int,
    @SortID varchar(12),
    @SpecID varchar(12),
    @GroupsID varchar(12),
    @NewsTitle varchar(120),
    @CreateDateBegin datetime,
    @CreateDateEnd datetime,
    @PageSize int,
    @CurrentPage int output,
    @TotalPage int output,
    @TotalRecord int output,
    @SortBy varchar(100)
    )
AS

--把所有单引号都替换成两个单引号
SET @SortID = REPLACE(LTRIM(RTRIM(@SortID)),'''','''''')
SET @SpecID = REPLACE(LTRIM(RTRIM(@SpecID)),'''','''''')
SET @GroupsID = REPLACE(LTRIM(RTRIM(@GroupsID)),'''','''''')
SET @NewsTitle = REPLACE(LTRIM(RTRIM(@NewsTitle)),'''','''''')
SET @SortBy = REPLACE(LTRIM(RTRIM(@SortBy)),'''','''''')
IF @SortBy=''
BEGIN
    SET @SortBy='NewsID DESC'
END

DECLARE @Sql NVARCHAR(2000)
DECLARE @SqlCount NVARCHAR(2000)
DECLARE @WhereClause NVARCHAR(2000)
--判断是专题文章还是系统文章,1为系统文章,2为专题文章
IF @vType ='1'
BEGIN
SET @Sql = 'SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @SortBy + ') AS RowID FROM [dbo].[vNewsMST] '
SET @SqlCount = 'SELECT @Count=count(*) FROM [dbo].[vNewsMST] '
END
ELSE IF @vType ='2'
BEGIN
SET @Sql = 'SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @SortBy + ') AS RowID FROM [dbo].[vSpecMST] '
SET @SqlCount = 'SELECT @Count=count(*) FROM [dbo].[vSpecMST] '
END

SET @WhereClause = 'WHERE DeleteFlag=0 '
IF RTrim(@SortID)<>''
    SET @WhereClause = @WhereClause + ' AND SortID=''' + @SortID + ''''
    SET @WhereClause = @WhereClause + ' OR SortID LIKE ''' + @SortID + '%'''
IF RTrim(@SpecID)<>''
    SET @WhereClause = @WhereClause + ' AND SpecID=''' + @SpecID + ''''
IF RTrim(@GroupsID)<>''
    SET @WhereClause = @WhereClause + ' AND GroupsID=''' + @GroupsID + ''''
[color=#FF0000]IF RTrim(@NewsTitle)<>''
    SET @WhereClause = @WhereClause + ' AND NewsTitle  LIKE ''%' + @NewsTitle + '%'''[/color]
IF RTrim(@CreateDateBegin)<>Cast('1900-1-1' AS DateTime)
    SET @WhereClause = @WhereClause + ' AND AddDate>=''' + Cast(@CreateDateBegin AS VARCHAR(30)) + ''''
IF RTrim(@CreateDateEnd)<>Cast('1900-1-1' AS DateTime)
    SET @WhereClause = @WhereClause + ' AND AddDate<=''' + Cast(@CreateDateEnd AS VARCHAR(30)) + ''''

SET @SqlCount = @SqlCount + @WhereClause
DECLARE @ParmDefinition nvarchar(100)
SET @ParmDefinition = N'@Count int OUTPUT';
EXECUTE sp_executesql @SqlCount, @ParmDefinition, @Count=@TotalRecord OUTPUT;
SET @TotalPage=CEILING(CAST(@TotalRecord AS DECIMAL)/@PageSize)

IF @CurrentPage > @TotalPage-1
    SET @CurrentPage=@TotalPage-1
IF @CurrentPage < 0
    SET @CurrentPage=0

DECLARE @_Start INT, @_End INT
SET @_Start = ((@CurrentPage * @PageSize) + 1)
SET @_End = (@_Start + @PageSize - 1)

SET @Sql = 'SELECT * FROM (' + @Sql + @WhereClause + ') AS TempTable WHERE (RowID >= ' + CAST(@_Start AS VARCHAR(10)) + ') AND (RowID <= ' + CAST(@_End AS VARCHAR(10)) + ')'
EXEC sp_executesql @Sql




我的分类结构是
001
001001
001002
001003
002
002001
002002
002003
003
……
很简单的!所以我起初就想用
SQL code

IF RTrim(@SortID)<>''
    SET @WhereClause = @WhereClause + ' AND SortID=''' + @SortID + ''''
    SET @WhereClause = @WhereClause + ' OR SortID LIKE ''' + @SortID + '%'''



001
001001
001002
001003
下的文章都检索出来匹配,检索出需要的文章,如果用
SET @WhereClause = @WhereClause + ' AND SortID='001''只能检索出父类的文章,却检索不出
001001
001002
001003
下面的文章,不知道怎么办,有没有哪位大哥帮忙下!万分感谢

------解决方案--------------------
S