Главная страница
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.021 c
15-1188204801
ocean
2007-08-27 12:53
2007.09.23
Как сохранить документы?


2-1188474394
DmitriyG.
2007-08-30 15:46
2007.09.23
Translate Error


15-1187875256
zdm77
2007-08-23 17:20
2007.09.23
трабла с компиляцией в PHP editor


2-1188239457
hprx
2007-08-27 22:30
2007.09.23
Menu


15-1187863762
Memed_1971
2007-08-23 14:09
2007.09.23
Fast Report 4.0 install