2015-08-18 3 views
0

У меня есть prolem с пейджинга в SQL Server 2012SQL Server 2012 пейджинговой возвращает неправильный результат

Это простая таблица для проверки:

CREATE TABLE [dbo].[TestTable] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [Code] [nvarchar](50) NULL, 
    [Type] [int] NULL, 
    [IsActive] [bit] NULL, 

    CONSTRAINT [PK_TestTable] 
    PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

SET IDENTITY_INSERT [dbo].[TestTable] ON 
GO 

INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (1, N'1', N'1', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (2, N'2', N'2', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (3, N'3', N'3', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (4, N'4', N'4', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (5, N'5', N'5', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (6, N'6', N'6', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (7, N'7', N'7', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (8, N'8', N'8', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (9, N'9', N'9', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (10, N'10', N'10', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (11, N'11', N'11', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (12, N'12', N'12', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (13, N'13', N'13', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (14, N'14', N'14', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (15, N'15', N'15', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (16, N'16', N'16', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (17, N'17', N'17', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (18, N'18', N'18', 1, 1) 
INSERT [dbo].[TestTable] ([ID], [Name], [Code], [Type], [IsActive]) 
VALUES (19, N'19', N'19', 1, 1) 
GO 

SET IDENTITY_INSERT [dbo].[TestTable] OFF 
GO 

Вот несколько скриншотов:

Все записи:

enter image description here

Попробуйте пейджинг, стр 1:

enter image description here

и страница 2:

enter image description here

Некоторые записи Dont появляются на обеих страницах.

Что нужно сделать, чтобы исправить это?

Большое спасибо

+0

SQL Server 2012 работает очень хорошо - вы запрашиваете ** первые 20 строк ** в своем первом запросе для ** первых 10 строк ** во втором запросе ** ** конечно ** вы увидите, что некоторые строки дублируются! Проверьте [официальную документацию для 'OFFSET ... FETCH'] (https://technet.microsoft.com/en-us/library/gg699618%28v=sql.110%29.aspx) и исправьте свои запросы! –

+0

Вы не показываете, когда показываете 3 фотографии Первая фотография, я просто хочу показать все записи (19 записей и порядок по типу) Вторая и третья фотографии - это пролет. Они не охватывают все записи таблицы – haiduong87

ответ

0

Если вы хотите, чтобы показать первые 10 строк, а затем использовать:

SELECT (columns) 
FROM TestTable 
ORDER BY [Type], ID 
    OFFSET 0 ROWS 
    FETCH NEXT 10 ROWS ONLY 

и для следующих 10 строк, использование:

SELECT (columns) 
FROM TestTable 
ORDER BY [Type], ID 
    OFFSET 10 ROWS -- you need to properly set the OFFSET !! 
    FETCH NEXT 10 ROWS ONLY 

Функции работают очень хорошо - вы не получили свой синтаксис совершенно правильно, вот и все.

Update: заказа по только[Type] не достаточно хорошо - если у вас есть много строк с одинаковым значением [Type], нет гарантированного заказа в пределах этой группы строк. Вам нужно включить что-то более полезное в ваш заказ, например. используя первичный ключ (который составляет уникальный на строку и поэтому четко устанавливает порядок). Я обновил свой ответ на использование [Type], ID для заказа

+0

Но я делаю то же, что и ваш образец ... Я хочу показать первые 10 строк, заказать по [Тип], а не ID Я показываю 3 изображения с таким же порядком по предложению И они пропускают некоторые записи. – haiduong87

+0

@ haiduong87: 'ORDER BY Type' немного бесполезен, если строки ** ALL ** содержат значение 1 - это не достаточно упорядоченный порядок ..... –

+0

Я просто покажу вам первые 19 записей моей таблицы, которые имеют такой же тип ... – haiduong87

Смежные вопросы