'daki ROW_NUMBER() OVER() yöntemini kullanarak farklı sütunlarda sıralama kullanarak sorgulama yapalım. Northwind veritabanını kullanıyorum ve sorguyu, diğer parametrelerle birlikte içeren bir saklı yordamla çalıştırmak istiyorum. aşağıdaki: sayfalandırma başladığıSQL Server 2005
@Offset
sıralama amaçlı kullanılan sütun belirtmek için,@Limit
sayfa boyutunu belirtmek için,
@SortColumn
belirtmek için,@SortDirection
, yükselen veya soyundan gelen sıralamayı belirtmek için. önbelleğe alma bir seçenek değildir bu yüzden sonuç kümesi (IMO, berbat ve ViewState kullanarak bile, kabul edilmez) satırları binlerce içerdiğinden
fikir veritabanı üzerinde sayfalama yapmaktır. SQL Server 2005 Bildiğiniz gibi
her bölüm ilk satır için 1'den başlayan bir sonuç kümesinin bir bölüm içinde üst üste sıralı numarasını döndüren fonksiyonu ROW_NUMBER sağlar.
Her döndürülmüş sütunda sıralama yapmalıyız (bu örnekte beş tane) ve dinamik SQL bir seçenek değildir, bu yüzden iki seçeneğimiz vardır: IF ... ELSE ...
bol ve 10 sorguya sahip olmak, korumak için bir cehennemdir, veya bir aşağıdaki gibi sorgusu:
WITH PaginatedOrders AS (
SELECT
CASE (@SortColumn + ':' + @SortDirection)
WHEN 'OrderID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID ASC)
WHEN 'OrderID:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID DESC)
WHEN 'CustomerID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.CustomerID ASC)
WHEN 'CustomerID:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.CustomerID DESC)
WHEN 'EmployeeID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.EmployeeID ASC)
WHEN 'EmployeeID:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.EmployeeID DESC)
WHEN 'OrderDate:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderDate ASC)
WHEN 'OrderDate:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderDate DESC)
WHEN 'ShippedDate:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID ASC)
WHEN 'ShippedDate:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID DESC)
END AS RowNumber,
OrderID, CustomerID, EmployeeID, OrderDate, ShippedDate
FROM Orders
-- WHERE clause goes here
)
SELECT
RowNumber, OrderID, CustomerID, EmployeeID, OrderDate, ShippedDate,
@Offset, @Limit, @SortColumn, @SortDirection
FROM PaginatedOrders
WHERE RowNumber BETWEEN @Offset AND (@Offset + @Limit - 1)
ORDER BY RowNumber
farklı argümanlarla, sorgu birkaç kez denedim, ve performans aslında oldukça iyidir, ama susturur o başka bir şekilde optimize edilebilir gibi görünüyor.
Bu sorguda bir sorun var mı, yoksa bu şekilde mi yaparsınız? Farklı bir yaklaşım mı önerirsiniz?
Benim için aptalca bir hata düzeltildi. Lütfen tekrar deneyin. – Tomalak