webman2.1连sql server2008不能翻页的问题

tianjie23

因为sql server2008不支持offset写法,Eloquent ORM在使用paginate($page_size, $col, "page", $page)进行翻页时就会报错
SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near 'offset'.
这个问题怎么解决呢?laravel有解决方案,但webman没有找到呀
目前我们只能使用sql server2008,项目太大,不要升级

190 2 0
2个回答

tanhongbin

你用的那个orm? lv的还是tp的 应该去相关框架找 webman用的是他们的orm

  • tianjie23 9天前

    用的lv,我使用了lv的解决方案,但无效呀,https://www.cnblogs.com/dust2/p/18543336 这个是我在laravel10上的解决方案

  • tanhongbin 9天前

    按照他的写法不能实现嘛?

  • tianjie23 9天前

    不能,不知道是自己用的不对,还是怎么回事,withTablePrefix不存在,并且方法 'setTablePrefix' 已弃用,还有我不知道在webman什么地方进行注册

  • tianjie23 9天前

    解决了,代码进行了改动

lsmir2

sql server 分页的做法是写存储过程.网上找有很多.我 这里给你一个参考实际上是ai写的

CREATE PROCEDURE [dbo].[usp_Pagination]
    @PageIndex INT = 1,               -- 当前页码(默认第1页)
    @PageSize INT = 10,               -- 每页记录数(默认10条)
    @TableName NVARCHAR(128),         -- 表名/视图名(必填)
    @OrderByColumn NVARCHAR(128),     -- 排序字段(必填,如:Id)
    @OrderByDesc BIT = 1,             -- 是否降序:1=降序,0=升序(默认降序)
    @WhereCondition NVARCHAR(MAX) = '',-- 查询条件(可选,如:"Status=1 AND Name LIKE '%test%'")
    @TotalCount INT OUTPUT            -- 输出参数:总记录数
AS
BEGIN
    SET NOCOUNT ON;

    -- 验证必填参数
    IF @TableName IS NULL OR @OrderByColumn IS NULL
    BEGIN
        RAISERROR('表名和排序字段不能为空', 16, 1);
        RETURN;
    END

    -- 处理页码/页大小的边界值
    SET @PageIndex = CASE WHEN @PageIndex < 1 THEN 1 ELSE @PageIndex END;
    SET @PageSize = CASE WHEN @PageSize < 1 THEN 10 ELSE @PageSize END;

    -- 拼接排序语句
    DECLARE @OrderBy NVARCHAR(256) = QUOTENAME(@OrderByColumn) + 
                                     CASE WHEN @OrderByDesc = 1 THEN ' DESC' ELSE ' ASC' END;

    -- 拼接查询条件(带WHERE关键字)
    DECLARE @Where NVARCHAR(MAX) = CASE WHEN @WhereCondition <> '' THEN ' WHERE ' + @WhereCondition ELSE '' END;

    -- 1. 获取总记录数
    DECLARE @CountSql NVARCHAR(MAX) = 
        'SELECT @TotalCount = COUNT(*) FROM ' + QUOTENAME(@TableName) + @Where;
    EXEC sp_executesql @CountSql, N'@TotalCount INT OUTPUT', @TotalCount OUTPUT;

    -- 2. 获取分页数据(基于ROW_NUMBER())
    DECLARE @StartRow INT = (@PageIndex - 1) * @PageSize + 1;
    DECLARE @EndRow INT = @PageIndex * @PageSize;

    DECLARE @PageSql NVARCHAR(MAX) = 
        'WITH CTE_Pagination AS (
            SELECT *, ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNum
            FROM ' + QUOTENAME(@TableName) + @Where + '
        )
        SELECT * FROM CTE_Pagination WHERE RowNum BETWEEN ' + CAST(@StartRow AS NVARCHAR) + ' AND ' + CAST(@EndRow AS NVARCHAR) + '
        ORDER BY ' + @OrderBy;

    EXEC sp_executesql @PageSql;
END
GO
  • 暂无评论
🔝