Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.056 c
15-1188253671
Petr V. Abramov
2007-08-28 02:27
2007.09.23
А почему тут нет вопросов по QuntumGrid


2-1188471289
Че
2007-08-30 14:54
2007.09.23
Delphi and DB


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


2-1188305625
Shad
2007-08-28 16:53
2007.09.23
Работа с другими программами


15-1187945267
Nic (from server)
2007-08-24 12:47
2007.09.23
Ещё одна проблема с web-сервером





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский