Форум: "Базы";
Текущий архив: 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