Aug 30, 2009

Paging by currsor

Nhân cái sự ông bạn gửi cho một bài về kỹ thuật tìm kiếm và săp xếp ở đây. Hôm nay đẹp trời xin bàn xâu thêm một chút về vấn đề này và giới thiệu một kỹ thuật khác để paging nữa là sử dụng cursor để anh em tham khảo.

1. Nói về tìm kiếm.
Nếu bạn làm về tìm kiếm dữ liệu (chỉ nói trong môi trường SQL - Database). Điều đầu tiên bạn phải tính đến Index đây là một thuộc tính vô cùng mạnh mẽ giúp bạn tìm kiếm. Bên cạnh đó nếu gặp chở ngại về Index bạn phải sử dụng tiếp tới Full Text Search. nếu bạn không sử dụng những thuộc tính này của database thì ứng dụng của bạn sẽ đần ra khi bạn phải search khoảng 4 nghìn records. Index là một thuộc tính cổ điển của các hệ quản trị dữ liệu, Nhưng khi bạn Index trên một trường dữ liệu là TEXT thì độ dài không chế của trường này bị giới hạn và như thế INDEX không thể làm việc trên trường dữ liệu text dài. Hoặc nếu có thì cũng không hiệu quả. Nhưng đừng lo lắng vì bạn sẽ hoàn toàn thỏa mãn việc tìm kiếm text với Full Text Search. Một design tốt cho DB sẽ là tiền đề để bạn cải thiện hiệu năng của hệ thống cũng như việc sẽ phải thay đổi lại cấu trúc ... Design tốt rất quan trọng

2. Nói về con trỏ.
Có rất nhiều những tranh cãi nhau về kỹ thuật paging bằng con trỏ cũng như sử dụng subquery (con sp của ông bạn sử dụng subquery ) . Theo ý kiến riêng tôi thây rằng con trỏ nhanh hơn nhưng không an toàn. Nguy cơ là rất lớn khi bạn sử dụng con trỏ trong việc paging.

3. Paging by cursor - demo

CREATE PROCEDURE [dbo].[prc_Paging_Cursor] (
@
Tables varchar(1000),
@
PK nvarchar(100),
@
Sort nvarchar(200) = NULL,
@
PageNumber int = 1,
@
PageSize int = 10,
@
Fields nvarchar(1000) = '*',
@
Filter nvarchar(1000) = NULL,
@
Group varchar(1000) = NULL)
AS

/*Find the @PK type*/
DECLARE @PKTable varchar(100)
DECLARE @
PKName varchar(100)
DECLARE @
type varchar(100)
DECLARE @
prec int

IF CHARINDEX('.', @PK) > 0
BEGIN
SET
@PKTable = SUBSTRING(@PK, 0, CHARINDEX('.',@PK))
SET @PKName = SUBSTRING(@PK, CHARINDEX('.',@PK) + 1, LEN(@PK))
END
ELSE
BEGIN
SET
@PKTable = @Tables
SET
@PKName = @PK
END

SELECT
@type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o
.id=c.id
JOIN systypes t on c
.xusertype=t.xusertype
WHERE o
.name = @PKTable AND c.name = @PKName

IF CHARINDEX('char', @type) > 0
SET
@type = @type + '(' + CAST(@prec AS varchar) + ')'

DECLARE @strPageSize varchar(50)
DECLARE @
strStartRow varchar(50)
DECLARE @
strFilter nvarchar(1000)
DECLARE @
strGroup varchar(1000)

/*Default Sorting*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PK

/*Default Page Number*/
IF @PageNumber < 1
SET
@PageNumber = 1

/*Set paging variables.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))

/*Set filter & group variables.*/
IF @Filter IS NOT NULL AND @Filter != ''
SET @strFilter = ' WHERE ' + @Filter + ' '
ELSE
SET @strFilter = ''
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''

--SET @type='uniqueidentifier'
/*Execute dynamic query*/

EXEC('
DECLARE @PageSize int
SET @PageSize = '
+ @strPageSize + '

DECLARE @PK '
+ @type + '
DECLARE @tblPK TABLE
(
PK '
+ @type + ' NOT NULL PRIMARY KEY
)

DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR
SELECT '
+ @PK + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '

OPEN PagingCursor
FETCH RELATIVE '
+ @strStartRow + ' FROM PagingCursor INTO @PK

SET NOCOUNT ON

WHILE @PageSize > 0 AND @@FETCH_STATUS = 0
BEGIN
INSERT @tblPK (PK) VALUES (@PK)
FETCH NEXT FROM PagingCursor INTO @PK
SET @PageSize = @PageSize - 1
END

CLOSE PagingCursor
DEALLOCATE PagingCursor

SELECT '
+ @Fields + ' FROM ' + @Tables + ' JOIN @tblPK tblPK ON ' + @PK + ' = tblPK.PK ' + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort
)

Aug 29, 2009

Chiết lý về phụ nữ

1. Phụ nữ giống như người dự báo thời tiết: Chỉ nhận là mình đoán thiếu chính xác chứ không sai.

2. Phụ nữ là một bản nhạc dài không có các nốt trầm.

3. Một người phụ nữ toàn diện : sáng diện, trưa diện, chiều diện, tối diện.

4. Đằng sau sự thành công của một người đàn ông luôn có hình bóng của một người đàn bà, và đằng sau sự thất bại của một người đàn ông là một người đàn bà thật sự.

5. Phụ nữ luôn lo lắng về tương lai cho đến khi có chồng. Đàn ông không bao giờ lo lắng về tương lai cho đến khi có vợ.

6. Phụ nữ cưới chồng với hi vọng anh ta sẽ thay đổi, xong anh ta không thay đổi. Đàn ông cưới vợ với hi vọng cô ta sẽ không thay đổi, xong cô ta lại thay đổi.

7. Về mặt triết học: Vợ là một thực thể độc lập tồn tại bên ngoài ta, ngoài ý muốn của ta.

8. Về mặt kinh tế: Vợ là ngân hàng vô luật pháp, không thể lệ: gửi vào thì dễ, rút ra thì khó mà không thể kiện cáo gì được.

9. Về mặt tài sản: Vợ là cái gì rất cũ mà không thể thanh lý được.

10. Về mặt xã hội: Vợ là cá nhân tự do, tình nguyện về chung sống với ta nhưng lại luôn tố cáo ta làm mất tự do của cô ấy, và nếu như ta trả lại thì lại không nhận.

11. Về mặt cổ học: Vợ là loại đồ cổ càng để lâu càng mất giá.

12. Về mặt sinh học: Vợ đáng sợ hơn mãnh thú, các bà vợ có họ gần với sư tử.

(ST)

Aug 28, 2009

Càng dâm càng thích

Tớ dấu cái ấy của tớ đi bằng nó.

Trưng màu sẫm lên tớ hoàn toàn yên tâm về sự thu hút của mình. Bên trong nó, bộ phận quan trọng bậc nhất cơ thể tớ có thể thoải mái cử động. Và…những cử động ấy thật tự do. Tuyệt vời…sướng nhất là không bị phát hiện. Những biểu cảm của ham muốn, đam mê mãnh liệt, nhiều khi không đàng hoàng cho lắm! Tớ không muốn mọi người dòm thấy.

Không đàng hoàng?

Đương nhiên, sẽ là tội lỗi, báng bổ nếu công khai hướng đến người khác giới lạ mặt hoặc người đối diện với thao tác đong đưa cái bộ phận nhạy cảm đó. Có nó, người ta thay vì cho tớ là "thiếu đứng đắn", thì sẽ đánh giá tớ: Hấp dẫn, quý phái, sang trọng, sành điệu, lịch sự…

Tớ dấu cái thứ quan trọng bậc nhất của tớ đi bằng nó.
Nó: Hai mảnh khá mỏng manh. Có thể do sở thích khác biệt nên cũng nhiều người chọn màu sáng hoặc sặc sỡ: Vàng, hồng, tím, xanh…Bây giờ, trang phục thông thường hay trang sức cũng chưa chắc được coi trọng bằng. Tớ đề cao người đầu tiên tạo ra nó.

Với tớ, chọn loại càng dâm càng thích. Nó che dấu tội lỗi giăng đầy trong mắt. Và cho mọi người cơ hội tưởng tưởng nhiều hơn. Bên ngoài nó đời vẫn sáng!

Đố biết cái ấy là cái gì

Kỹ thuật phân trang trong Database

Phần này của ông bạn tôi viết, gửi cho tôi theo kiểu khuyến mại. Đôi khi mình cũng lười thế là dùng luôn. Nhưng đọc kỹ lại phát hiện một số những điểm nên cài tiến.
1. Không sử dụng câu lệnh CREATE TABLE như trong này.
mà nên dùng DECLARE @tblTemp TABLE(id INT PRIMARY KEY, ...)

2. Không nên khai báo con trỏ trong SQL theo kiểu như thế này.
mà nên khai báo thế này thêm các từ khóa như readonly,...

bên cạnh đó cũng còn một kỹ thuật phân trang khác bằng cách sử dụng con trỏ. Tôi sẽ giới thiệu trong bài sau.

-------------------------------------------
if
exists (select name from sysobjects where name = 'GetManyCUS_ResultBySearch')
drop proc GetManyCUS_ResultBySearch
go

create procedure GetManyCUS_ResultBySearch
@Keyword nvarchar(100),
@
TypeID char(5),
@
PageSize int,
@
PageNumber int,
@
ItemCount int OUT

as
begin

declare @sqlNewsSelect nvarchar(max),
@
sqlDocumentSelect nvarchar(max),
@
sqlProjectFDISelect nvarchar(max),
@
sqlProjectODASelect nvarchar(max),
@
sqlNewsTerm nvarchar(max),
@
sqlDocumentTerm nvarchar(max),
@
sqlProjectFDITerm nvarchar(max),
@
sqlProjectODATerm nvarchar(max)

--------------------------------------------------------------------
/*Cac bieu thuc select*/
--------------------------------------------------------------------
set @sqlNewsSelect = '
select
a.NewsTitle as ''Title'',
cast(a.NewsDescription as nvarchar(250)) as ''Description'',
'''' as ''PathFile'',
b.TypeID as ''TypeID''
from CMS_News a
inner join CMS_Category b on a.CategoryID = b.CategoryID
where b.TypeID = ''news''
'
set @sqlDocumentSelect = '
select
a.DocumentName as ''Title'',
cast(a.DocumentDescription as nvarchar(250)) as ''Description'',
a.DocumentFilePath as ''PathFile'',
b.TypeID as ''TypeID''
from CMS_Document a
inner join CMS_Category b on a.CategoryID = b.CategoryID
where b.TypeID = ''docum''
'
set @sqlProjectFDISelect = '
select
a.ProjectFDIName as ''Title'',
cast(a.FDIDetailContent as nvarchar(250)) as ''Description'',
a.FDIDocumentPath as ''PathFile'',
b.TypeID as ''TypeID''
from CMS_ProjectFDI a
inner join CMS_Category b on a.CategoryID = b.CategoryID
where b.TypeID = ''proje''
'
set @sqlProjectODASelect = '
select
a.ProjectODAName as ''Title'',
cast(a.ODADetailContent as nvarchar(250)) as ''Description'',
a.ODADocumentPath as ''PathFile'',
b.TypeID as ''TypeID''
from CMS_ProjectODA a
inner join CMS_Category b on a.CategoryID = b.CategoryID
where b.TypeID = ''proje''
'
--------------------------------------------------------------------
/*Phan tich chuoi keyword dau vao thanh cac keyword nho*/
--------------------------------------------------------------------

set @sqlNewsTerm = ' 1 != 1'
set @sqlDocumentTerm = ' 1 != 1'
set @sqlProjectFDITerm = ' 1 != 1'
set @sqlProjectODATerm = ' 1 != 1'

create table #Keyword(Keyword nvarchar(100))
declare @sep nvarchar(10)
set @sep = ' '
declare @keywordTemp nvarchar(500)
set @keywordTemp = replace(LTRIM(RTRIM(@Keyword))+' ','''','''''')
while(
CHARINDEX(@sep + @sep, @keywordTemp COLLATE Latin1_General_CS_AS) > 0)
set @keywordTemp = replace(@keywordTemp, @sep + @sep, @sep)
declare @
indexBegin int
declare @indexEnd int
set
@indexBegin = 1
while(CHARINDEX ( @sep,@keywordTemp COLLATE Latin1_General_CI_AS, @indexBegin) > 0)--Latin1_General_CS_AS
begin
set
@indexEnd = CHARINDEX ( @sep,@keywordTemp COLLATE Latin1_General_CI_AS, @indexBegin)
insert into #Keyword values (SUBSTRING(@keywordTemp, @indexBegin, @indexEnd - @indexBegin))
set @indexBegin = @indexEnd + 1
end
declare @KeywordExec nvarchar(500)
declare
rm_cursor cursor for
select
Keyword
from
#Keyword
open rm_cursor
fetch next from rm_cursor into
@KeywordExec
while (@@FETCH_STATUS = 0)
begin
--------------------------------------------------------------------
/*Dua cac tu tim duoc trong chuoi de ghep thanh bieu thuc tim kiem*/
--------------------------------------------------------------------
set @KeywordExec = 'N''%' + @KeywordExec + '%'''
set @sqlNewsTerm = @sqlNewsTerm + ' or a.NewsTitle like ' + @KeywordExec
set
@sqlDocumentTerm = @sqlDocumentTerm + ' or a.DocumentName like ' + @KeywordExec
set
@sqlProjectFDITerm = @sqlProjectFDITerm + ' or a.ProjectFDIName like ' + @KeywordExec
set
@sqlProjectODATerm = @sqlProjectODATerm + ' or a.ProjectODAName like ' + @KeywordExec
fetch next from rm_cursor into
@KeywordExec
end
close rm_cursor
deallocate rm_cursor
drop table
#Keyword

declare @sql nvarchar(max)
set @sql = '
select
row_number() over( order by Title) as RowNumber,
Title,
Description,
PathFile,
TypeID
from ('
+ @sqlNewsSelect + ' and (' + @sqlNewsTerm + ')'
+ ' union '
+ @sqlDocumentSelect + ' and (' + @sqlDocumentTerm + ')'
+ ' union '
+ @sqlProjectFDISelect + ' and (' + @sqlProjectFDITerm + ')'
+ ' union '
+ @sqlProjectODASelect + ' and (' + @sqlProjectODATerm + ')'
+') as tblSelect'

insert into loghiep values(@sql)

declare @
sqlcount nvarchar(max)
set @sqlcount = 'select count(*) from ('+@sql+') as tbl_Result'
create table #ItemCount(ItemCount int)
insert into #ItemCount exec(@sqlcount)
set @ItemCount = (select top(1) ItemCount from #ItemCount)
drop table #ItemCount
declare @ItemMin int, @ItemMax int
set
@ItemMin = @PageSize * @PageNumber - @PageSize + 1
set
@ItemMax = @PageSize * @PageNumber + 1
if @ItemMin < 0 set @ItemMin = 0
if @ItemMax < 0 set @ItemMax = 0
set
@sql = 'select
Title,
Description,
PathFile,
TypeID
from ('
+@sql+') as tbl_Result where 1 = 1'
set @sql = @sql + ' and RowNumber >= ' + convert(varchar(10), @ItemMin)
set @sql = @sql + ' and RowNumber < ' + convert(varchar(10), @ItemMax)
exec(@sql)

end
go

grant execute on GetManyCUS_ResultBySearch to
public
go
 
Bạn có thể dùng bài viết của tôi tùy ý bạn nhưng vui lòng ghi lại rõ nguồn cung cấp
The world in a click_
Copyright © 2008 linhdkl