Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

Постраничная выборка   Найти похожие ветки 

 
Empleado ©   (2007-05-21 12:55) [0]

Наверное уже заезженная тема...
Надо: организовать выборку из динамически задаваемых таблиц постранично.
Ограничения: только для SQL2005.

Вот тут покопался немного в доках. В общем - ругайте:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Empleado
-- Description: Returns a paged result set of a SELECT * from a table
-- =============================================
ALTER PROCEDURE [dbo].[spGetPagedData]
-- Add the parameters for the stored procedure here
@TableName nvarchar(128),
@OrderByFields nvarchar(MAX),
@SelectedFields nvarchar(MAX),
@PageNumber int,
@PageSize int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @SQLStmt nvarchar(MAX)
DECLARE @SQLParams nvarchar(MAX)
DECLARE @PageFirstLine int, @PageLastLine int

SET @PageFirstLine = (@PageNumber - 1)* @PageSize + 1
SET @PageLastLine = @PageNumber * @PageSize

SET @SQLStmt = N"WITH CTE_ROWNUMERATOR AS " + CHAR(13) +
     N"(SELECT ROW_NUMBER() OVER (ORDER BY " + @OrderByFields + ") AS CTE_RowNum, " + @SelectedFields + " " + CHAR(13) +
    N" FROM " + @TableName + ") " + CHAR(13) +
    N"SELECT " + @SelectedFields + " " + CHAR(13) +
    N"FROM CTE_ROWNUMERATOR " + CHAR(13) +
    N"WHERE CTE_RowNum BETWEEN @PgFrstLine AND @PgLstLine"

SET @SQLParams = N"@PgFrstLine int, @PgLstLine int"
--to debug:
--PRINT @SQLStmt

-- Execute SQL statement
EXECUTE sp_executesql @SQLStmt, @SQLParams,
   @PgFrstLine = @PageFirstLine, @PgLstLine = @PageLastLine
END
/*     Code to test:

DECLARE @SQLStmt nvarchar(MAX)
DECLARE @TableName nvarchar(128)
DECLARE @OrderByFields nvarchar(1024), @SelectedFields nvarchar(1024)
DECLARE @PageNumber int, @PageSize int

SET @TableName = N"HR.Persons"
SET @OrderByFields = N"IDPerson"--"FirstName, LastName"
SET @SelectedFields = N"IDPerson, FirstName, LastName"
SET @PageNumber = 9
SET @PageSize = 5

EXEC spGetPagedData @TableName, @OrderByFields, @SelectedFields, 9, 5
*/


 
Johnmen ©   (2007-05-21 13:03) [1]

Отстой.


 
Empleado ©   (2007-05-21 13:10) [2]


> Johnmen ©   (21.05.07 13:03) [1]

Goood! Хорошо поругал! мужик!
Предложил бы свой вариант/идею/мысль? Был бы признателен...


 
clickmaker ©   (2007-05-21 13:26) [3]


>  В общем - ругайте

а похвалить мона?


 
Jan1   (2007-05-21 13:26) [4]

надеюсь читал?
http://www.sql.ru/faq/faq_topic.aspx?fid=105


 
Jan1   (2007-05-21 13:30) [5]

Короче переделал второй вариант, а не сам придумал.


 
Empleado ©   (2007-05-21 13:42) [6]


> clickmaker ©   (21.05.07 13:26) [3]

Да мне кажется, что не за что. Тут все просто:
Взял объяснения из хелпа, да переделал это в соответствии с динамически задаваемыми параметрами - имя таблицы, столбцы и т.д..

Но что-то мне подсказывает, что из-за этого (из-за exec) не будет никаких оптимизаций при работе сервера, т.е. не будет достигнут тот performance, как при работе только со stored procedures. Я прав или ошибаюсь?

>Jan1   (21.05.07 13:26) [4]
Сохранил, спасибо.


 
ANB ©   (2007-05-21 13:48) [7]


> что из-за этого (из-за exec) не будет никаких оптимизаций
> при работе сервера

Оптимизации будут. При использовании ХП экономится время только на парсинге запроса. Если в динамическом скл запросы параметризированные (текст не меняется) и никакая другая скотина процедурный кэш не замусорила, то парсится запрос будет только один раз.


 
Empleado ©   (2007-05-21 14:04) [8]


> ANB ©   (21.05.07 13:48) [7]

Т.е., пока выполняется запрос с параметром "HR.Persons" как название таблицы, из которой делаем постраничную выборку, то оптимизация есть.
Как только, например другой юзер, вызывает эту SP для другой таблицы, например "HR.Addresses", с другими полями, то оптимизации нет.
И, соответственно, чем больше народа вызывает эту процедуру с отличными друг от друга параметрами, тем оно работает медленнее, т.к. каждый раз надо делать парсинг заново. Так?


 
ANB ©   (2007-05-21 18:07) [9]


> т.к. каждый раз надо делать парсинг заново. Так?

парсинг нужно делать только если в процедурном кэше (кстати, он не резиновый, посему запросы надо бы параметризировать) нету уже распарсенного запроса с таким же текстом.



Страницы: 1 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
15-1188272453
schaps
2007-08-28 07:40
2007.09.23
Не верь глазам своим


11-1171922028
Виталий*
2007-02-20 00:53
2007.09.23
Проблема с прозрачностью на ровном месте.


15-1187864995
DVM
2007-08-23 14:29
2007.09.23
MD5


11-1172162117
kotlf
2007-02-22 19:35
2007.09.23
под win2000 arial показывает квадратики


8-1166134844
Доцент
2006-12-15 01:20
2007.09.23
Как затормозить MediaPleer?