Динамічне сортування в процедурах, що зберігаються в SQL


126

Це питання, про яке я витрачав години на дослідження. Мені здається, це те, що повинно було вирішуватись сучасними рішеннями RDBMS, але поки я не знайшов нічого, що насправді стосується того, що я вважаю надзвичайно поширеною потребою в будь-якому додатку для Інтернету чи Windows із базою даних бази даних.

Я кажу про динамічне сортування. У моєму фантастичному світі це повинно бути таким же простим, як щось на зразок:

ORDER BY @sortCol1, @sortCol2

Це канонічний приклад, який дають розробники SQL і зберігаються процедури на всіх форумах в Інтернеті. "Чому це неможливо?" запитують вони. Незмінно хтось з часом приходить разом з ними ознайомитись зі сформованим характером збережених процедур, планами виконання в цілому та всілякими іншими причинами, чому неможливо ввести параметр безпосередньо в ORDER BYпункт.


Я знаю, що дехто з вас вже думає: "Давайте, тоді клієнт робити сортування". Природно, це вивантажує роботу з вашої бази даних. У нашому випадку сервери баз даних навіть не порушують потужність 99% часу, і вони навіть не є багатоядерними, або будь-яке інше безліч вдосконалень архітектури системи, які відбуваються кожні 6 місяців. Тільки з цієї причини не матиме проблеми з сортуванням наших баз даних. Крім того, бази даних дужедобре сортується. Вони оптимізовані для цього і мали роки, щоб правильно це зробити, мова для його роботи неймовірно гнучка, інтуїтивна та проста, і перш за все будь-який початківець письменник SQL знає, як це зробити, і ще важливіше, що вони знають, як це редагувати, вносити зміни, робити технічне обслуговування тощо. Коли ваші бази даних далекі від оподаткування, і ви просто хочете спростити (і скоротити!) час розробки, це здається очевидним вибором.

Тоді є веб-випуск. Я розігрувався з JavaScript, який буде робити сортування HTML-таблиць на стороні клієнта, але вони неминуче недостатньо гнучкі для моїх потреб, і, знову ж таки, оскільки мої бази даних не надмірно оподатковуються і можуть сортувати дуже легко, я важко виправдати час, який знадобиться, щоб переписати або прокрутити власний сортувальник JavaScript. Те саме стосується сортування на стороні сервера, хоча це, мабуть, набагато більше переваги над JavaScript. Мені не дуже подобається накладні витрати на DataSets, тому позов мене.

Але це повертає те, що це неможливо - точніше, не просто. З попередніми системами я зробив неймовірно злому способу отримання динамічного сортування. Це було не красиво, не інтуїтивно, просто та гнучко, і початківець SQL-програвач був би втрачений за лічені секунди. Вже зараз це виглядає не стільки «рішенням», скільки «ускладненням».


Наступні приклади не мають на меті розкривати будь-які найкращі практики чи гарний стиль кодування чи що-небудь, а також не свідчать про мої здібності як програміста T-SQL. Вони є такими, якими вони є, і я повністю визнаю, що вони збивають з пантелику, поганою формою і просто очевидним злом.

Ми передаємо ціле значення як параметр у збережену процедуру (назвемо параметр просто "сортування") і з цього визначимо купу інших змінних. Наприклад ... скажімо, сортування дорівнює 1 (або за замовчуванням):

DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)

SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';

IF @sort = 1                -- Default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'asc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'asc';
END
ELSE IF @sort = 2           -- Reversed order default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'desc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'desc';
END

Ви вже можете бачити, як якщо я оголосив більше змінних @colX, щоб визначити інші стовпці, я міг би по-справжньому отримати творчість за допомогою стовпців, щоб сортувати на основі значення "сортувати" ... щоб використовувати його, зазвичай це виглядає як наступне неймовірно безладний пункт:

ORDER BY
    CASE @dir1
        WHEN 'desc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir1
        WHEN 'asc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END,
    CASE @dir2
        WHEN 'desc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir2
        WHEN 'asc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END

Очевидно, що це дуже позбавлений приклад. Справжній матеріал, оскільки у нас зазвичай є чотири або п’ять стовпців для підтримки сортування, кожен з яких можливий вторинний або навіть третій стовпчик для сортування на додаток до цього (наприклад, дату спадання, потім відсортовану вдруге за прізвищем за зростанням) та кожну підтримуючу бі- спрямоване сортування, яке ефективно подвоює кількість випадків. Так ... вона стає волохатою дійсно швидко.

Ідея полягає в тому, що можна «легко» змінити випадки сортування таким чином, щоб транспортний засіб було відсортовано перед тим, як зберігати час… але псевдо-гнучкість, принаймні в цьому простому прикладі, справді закінчується. По суті, кожен випадок, який не виконує тест (оскільки наш метод сортування не застосовується до цього часу), має значення NULL. Таким чином, ви закінчуєте пропозицію, яка функціонує так:

ORDER BY NULL DESC, NULL, [storagedatetime] DESC, blah blah

Ви отримуєте ідею. Це працює тому, що SQL Server ефективно ігнорує нульові значення в порядку за допомогою пунктів. Це надзвичайно важко підтримувати, оскільки, напевно, може бачити кожен, хто має будь-які базові знання SQL. Якщо я загубив когось із вас, не відчувайте себе погано. Нам знадобилося багато часу, щоб ми працювали, і ми все ще плутаємося, намагаючись редагувати його або створювати нові, як це. На щастя, його не потрібно часто змінювати, інакше це швидко стане «не вартим клопоту».

Тим НЕ менше , він зробив роботу.


Моє запитання тоді: чи є кращий спосіб?

Я в порядку з іншими рішеннями, ніж ті, що зберігаються, оскільки я розумію, що це може бути не так. Переважно, я хотів би знати, чи може хтось зробити це краще в рамках Збереженої процедури, але якщо ні, як ви все обробляєте, дозволяючи користувачеві динамічно сортувати таблиці даних (теж двонаправлені) за допомогою ASP.NET?

І дякую за те, що ви прочитали (або принаймні скумпували) таке довге запитання!

PS: Будьте раді, що я не показав свого прикладу збереженої процедури, яка підтримує динамічне сортування, динамічне фільтрування / пошук тексту за стовпцями, розбиття сторінок за допомогою ROWNUMBER () НАД і І спробувати ... спіймати за допомогою трансляції транзакцій на помилках ... "розмір бегемота" навіть не починає їх описувати.


Оновлення:

  • Я хотів би уникнути динамічного SQL . Розбиття рядка разом і запуск EXEC на ньому перешкоджає значній мірі мати збережену процедуру в першу чергу. Іноді я замислююся, хоч чи не варто цього робити, хоча б у цих особливих динамічних випадках сортування. Тим не менш, я завжди відчуваю себе брудним, коли роблю такі динамічні рядки SQL - як, як і раніше, живу в класичному світі ASP.
  • Дуже багато причин, які ми хочемо, щоб збережені процедури в першу чергу були в безпеці . Я не можу телефонувати з питань безпеки, лише пропоную рішення. За допомогою SQL Server 2005 ми можемо встановлювати дозволи (на основі кожного користувача, якщо це необхідно) на рівні схеми для окремих збережених процедур, а потім заперечувати будь-які запити до таблиць безпосередньо. Критикувати плюси та мінуси такого підходу можливо для іншого питання, але знову це не моє рішення. Я просто мавпа з провідним кодом. :)

Дивіться також stackoverflow.com/questions/3659981/… - динамічне ЗАМОВЛЕННЯ SQL Server із змішаними типами даних
LCJ

Динамічний SQL - це найвищий спосіб FAR ... ЯКЩО [і це велике IF] .. ваш рівень доступу до даних є строгим, а ваш динамічний SQL генерується системою, яка жорстко запрограмована з правилами RDBMS, вираженими в ідеальній формі. Алгоритмічно створена архітектура баз даних - це краса ...
hajikelist

Відповіді:


97

Так, це біль, і те, як ви це робите, схоже на те, що я роблю:

order by
case when @SortExpr = 'CustomerName' and @SortDir = 'ASC' 
    then CustomerName end asc, 
case when @SortExpr = 'CustomerName' and @SortDir = 'DESC' 
    then CustomerName end desc,
...

Це, на мій погляд, все ще набагато краще, ніж створення динамічного SQL з коду, що перетворюється на кошмар масштабності та обслуговування DBA.

Що я роблю з коду, це рефакторинг підкачки та сортування, так що я, принаймні, не маю багато повторень там із заповненням значень для @SortExprта @SortDir.

Що стосується SQL, зберігайте дизайн та форматування однакові між різними збереженими процедурами, щоб воно було принаймні акуратним та впізнаваним, коли ви заходите вносити зміни.


1
Саме так. Моєю метою було уникнути виконання команди EXEC на великій 5000 рядку вархара. Все, що ми робимо, потрібно робити через збережені процедури, якщо тільки для додаткової безпеки, оскільки ми можемо встановлювати дозволи на них на рівні схеми. Масштабованість та підвищення продуктивності - лише плюс у нашому випадку.
Шон Хенлі

1
Додайте можливість ремонту {безпека, масштабованість, продуктивність}. Коли у вас є 3 або 4 програми, у яких динамічний SQL працює проти вашої БД, ви накрутитеся, ви нічого не можете змінити, особливо з віком додатків та розробниками. Exec та динамічний sql - це зло.
Eric Z Beard

Це просто це - ми вже це робимо, ще до того, як я потрапив сюди, для всіх ще запущених веб-додатків Classic ASP та багатьох, багатьох додатків Access VB, які все ще циркулюють. Я смикаюсь і мені потрібно стримувати позиви виправляти яскраві помилки будь-коли, коли мені доводиться виконувати технічне обслуговування на будь-якій з них.
Шон Хенлі

1
Це те, що я також роблю, за винятком того, що кодую напрямок у SortExpr: ЗАМОВЛЕННЯ ДЛЯ СЛУЧАЮ КОЛИ sort = 'FirstName' THEN FirstName END ASC, CASE WHEN sort = '-FirstName' THEN FirstName END DESC
Michael Bray

Це кошмар для DBA і інженерів програмного забезпечення. Таким чином, замість того, щоб мати динамічні, але суворі системи, які генерують виразні заяви SQL на основі вашої інформаційної схеми, у вас є ця огидна дура жорсткого кодування. Це погане програмування, це найкраще.
hajikelist

23

Такий підхід утримує стовпці сортування від дублювання двічі в порядку, і є трохи більш читабельним IMO:

SELECT
  s.*
FROM
  (SELECT
    CASE @SortCol1
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol1,
    CASE @SortCol2
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol2,
    t.*
  FROM
    MyTable t) as s
ORDER BY
  CASE WHEN @dir1 = 'ASC'  THEN SortCol1 END ASC,
  CASE WHEN @dir1 = 'DESC' THEN SortCol1 END DESC,
  CASE WHEN @dir2 = 'ASC'  THEN SortCol2 END ASC,
  CASE WHEN @dir2 = 'DESC' THEN SortCol2 END DESC

Це здалося гарною відповіддю, але, здається, не працює, коли сортувальні стовпці мають різні типи даних
SlimSim


6

Мої програми роблять це багато, але всі вони динамічно створюють SQL. Однак, коли я маю справу зі збереженими процедурами, я роблю це:

  1. Зробіть збережену процедуру функцією, яка повертає таблицю ваших значень - не сортуйте.
  2. Потім у своєму коді програми зробіть select * from dbo.fn_myData() where ... order by ...так, щоб ви могли динамічно вказати там порядок сортування.

Тоді принаймні динамічна частина є у вашій програмі, але база даних все ще робить важкий підйом.


1
Це, мабуть, найкращий компроміс, який я бачив поки що між використанням динамічного SQL та збереженими процедурами разом. Мені це подобається. Я можу експериментувати колись із подібним підходом, але така зміна була б забороненою в будь-якому з наших існуючих поточних проектів.
Шон Хенлі

1
Це можна досягти, використовуючи змінну локальної таблиці замість табличної функції, що повертає дані. Я вважаю локальні таблиці більш гнучкими, ніж функції, оскільки ви можете вивести деяку інформацію про налагодження.
Санджай Залке

5

Збережена техніка процедури (хак?) Я використовував, щоб уникнути динамічного SQL для певних завдань, - це мати унікальний стовпчик сортування. Тобто,

SELECT
   name_last,
   name_first,
   CASE @sortCol WHEN 'name_last' THEN [name_last] ELSE 0 END as mySort
FROM
   table
ORDER BY 
    mySort

Це легко перемогти у поданні - ви можете стиснути поля в стовпці mySort, змінити порядок за допомогою математичних чи датних функцій тощо.

Переважно, я використовую свої сіткові перегляди asp.net або інші об'єкти зі вбудованою сортуванням, щоб зробити сортування для мене ПІСЛЯ отримання даних із Sql-Server. Або навіть якщо він не вбудований - наприклад, таблиці даних тощо в asp.net.


4

Є кілька різних способів зламати це.

Передумови:

  1. Лише один оператор SELECT в sp
  2. Залиште будь-яке сортування (або мати за замовчуванням)

Потім вставте в таблицю темп:

create table #temp ( your columns )

insert #temp
exec foobar

select * from #temp order by whatever

Спосіб №2: встановіть зв'язаний сервер назад до себе, а потім виберіть із цього, використовуючи openquery: http://www.sommarskog.se/share_data.html#OPENQUERY


4

Можливо, є й третій варіант, оскільки ваш сервер має багато запасних циклів - використовуйте допоміжну процедуру для сортування за допомогою тимчасової таблиці. Щось на зразок

create procedure uspCallAndSort
(
    @sql varchar(2048),        --exec dbo.uspSomeProcedure arg1,'arg2',etc.
    @sortClause varchar(512)    --comma-delimited field list
)
AS
insert into #tmp EXEC(@sql)
declare @msql varchar(3000)
set @msql = 'select * from #tmp order by ' + @sortClause
EXEC(@msql)
drop table #tmp
GO

Caveat: Я цього не тестував, але він повинен "працювати" в SQL Server 2005 (який створить тимчасову таблицю з набору результатів, не зазначаючи стовпці заздалегідь.)


2

В якийсь момент, чи не варто варто відходити від збережених процедур і просто використовувати параметризовані запити, щоб уникнути подібних хакерів?


1
У певних випадках, можливо, вони є кувалдами на цвяху, але часто ми хочемо встановлювати дозволи (зокрема, виконувати) безпосередньо на збережені процедури і забороняти будь-які запити SQL безпосередньо проти таблиць, навіть SELECT. Мені не дуже подобається хакерство, але безпека - це не мій заклик робити.
Шон Хенлі

1
Ось чому стільки людей переходять на об'єктивне реляційне картографування. Зайві кругові поїздки для сортування, величезні блоки CASE для тих же, безглуздих оновлень тонн стовпців, коли насправді потрібно оновити лише один і т. Д. Одним вигідним аргументом для збережених процедур, що залишається, є безпека.
Пітсбург DBA

Я переходжу з ORM (EF) до збереженої процедури, оскільки ORM не підтримує пошук у повному тексті.
Ронні Овербі

@RonnieOverby Повнотекстовий пошук часто краще обслуговується спеціальним рішенням, наприклад, Lucene.
Хенк Гей

@HankGay У мене дивне відчуття, що структура сутності також не підтримує Lucene.
Ронні Овербі

2

Я згоден, використовуйте сторону клієнта. Але виявляється, що це не відповідь, яку ви хочете почути.

Отже, він ідеальний таким, яким він є. Я не знаю, чому ви хочете це змінити, або навіть запитати "Чи є кращий спосіб". Дійсно, його слід називати «Шлях». Крім того, він, здається, працює і задовольняє потреби проекту просто чудово і, ймовірно, буде достатньо розтяжним на довгі роки. Оскільки ваші бази даних не оподатковуються, а сортування насправді дуже просто, слід залишатися таким на довгі роки.

Я б не попотіла.


У мене немає проблем із клієнтом, оскільки я проходжу цей маршрут із програмами Windows. А як щодо веб-додатків? Я не знаходжу жодного рішення JavaScript дійсно досить гнучким. І так, це працює так, як я сказав так, як у нас це є, але це кошмар SQL. Звичайно, я хотів би знати, чи є кращі способи.
Шон Хенлі

Він вбудований у новіші (2.0 і вище) .NET-елементи управління. Або ви можете створити свій власний і застосувати його до перегляду даних. msdn.microsoft.com/en-us/library/hwf94875(VS.80).aspx
DS

2
Тоді моя проблема полягає в масштабованості та продуктивності. Для сортування на стороні клієнта або веб-сервера необхідне завантаження всіх даних, а не лише 10 або 15, які ви збираєтеся відображати на сторінці за один раз. Це в довгостроковій перспективі надзвичайно дорого, тоді як сортування баз даних цього не має.
Шон Хенлі

2

Під час пейджингу відсортованих результатів динамічний SQL - хороший варіант. Якщо у вас параноїк щодо ін'єкції SQL, ви можете використовувати номери стовпців замість назви стовпців. Я робив це, перш ніж використовувати негативні значення для зменшення. Щось на зразок цього...

declare @o int;
set @o = -1;

declare @sql nvarchar(2000);
set @sql = N'select * from table order by ' + 
    cast(abs(@o) as varchar) + case when @o < 0 then ' desc' else ' asc' end + ';'

exec sp_executesql @sql

Тоді вам просто потрібно переконатися, що число знаходиться в межах від 1 до # стовпців. Ви можете навіть розширити це до списку номерів стовпців і проаналізувати це в таблиці входів, використовуючи функцію, як ця . Тоді ви б будували порядок таким чином ...

declare @cols varchar(100);
set @cols = '1 -2 3 6';

declare @order_by varchar(200)

select @order_by = isnull(@order_by + ', ', '') + 
        cast(abs(number) as varchar) + 
        case when number < 0 then ' desc' else '' end
from dbo.iter_intlist_to_tbl(@cols) order by listpos

print @order_by

Один недолік - ви повинні пам'ятати порядок кожного стовпця на стороні клієнта. Тим більше, що ви не відображаєте всі стовпці або відображаєте їх в іншому порядку. Коли клієнт хоче сортувати, ви позначаєте назви стовпців у порядку стовпців та генеруєте список вкладів.


Ми використовуємо sp_executesql для побудови запитів динамічної звітності. Дуже ефективний. SQL неможливо побудувати з програми, але параметри просто вставляються там, де це потрібно, і виконуються як звичайні.
Джош Смітон

2

Аргументом проти проведення сортування на стороні клієнта є великі обсяги даних та сторінки. Після того, як кількість рядків вийде за межі того, що ви можете легко відобразити, ви часто сортуєте як частину пропуску / прийому, яку, ймовірно, хочете запустити в SQL.

Для Entity Framework ви можете використовувати збережену процедуру для обробки тексту. Якщо ви зіткнулися з однаковою проблемою сортування, я бачив рішення - використовувати збережений додаток для пошуку, повертаючи лише відповідну ідентифікаційну клавішу для відповідності. Далі, повторно запитуйте (з сортуванням) проти db, використовуючи ідентифікатори зі списку (містить). EF справляється з цим досить добре, навіть коли набір ідентифікаторів досить великий. Так, це дві поїздки в обидва кінці, але це дозволяє вам завжди зберігати сортування в БД, що може бути важливо в деяких ситуаціях і заважає вам записати логічне навантаження логіки в збережену процедуру.


1

Як щодо керування сортуванням матеріалів, що відображають результати - сітки, звіти тощо, а не SQL?

Редагувати:

Для уточнення речей, оскільки ця відповідь була озвучена раніше, я трохи детальніше ...

Ви заявили, що знаєте про сортування на стороні клієнта, але хочете уникати цього. Це, звичайно, ваш дзвінок.

Хоча я хотів би зазначити, що, роблячи це на стороні клієнта, ви можете перетягувати дані ВІН, а потім працювати з ними, як вам завгодно - проти того, щоб робити кожен раз багато разів назад і назад до сервера сорт змінюється.

Ваш SQL Server зараз не оподатковується, і це приголомшливо. Це не повинно бути. Але те, що він ще не перевантажений, ще не означає, що він залишиться таким назавжди.

Якщо ви використовуєте будь-який з нових матеріалів ASP.NET для показу в Інтернеті, багато цих матеріалів уже випікаються прямо в.

Чи варто додавати стільки коду до кожної збереженої процедури, щоб просто здійснити сортування? Знову твій дзвінок.

Я не є тим, хто в кінцевому рахунку буде відповідальним за його підтримку. Але подумайте над тим, що буде брати участь, коли стовпці додаються / видаляються в межах різних наборів даних, що використовуються збереженими процедурами (вимагають модифікацій операторів CASE) або коли раптом замість сортування за двома стовпцями користувач вирішує, що їм потрібно три - вимагаючи від вас тепер оновити всі ваші збережені процедури, що використовують цей метод.

Для мене варто придбати робоче рішення на стороні клієнта та застосувати його до декількох екранів даних, орієнтованих на користувачів, і зробити це з ним. Якщо додати новий стовпець, він уже обробляється. Якщо користувач хоче сортувати за кількома стовпцями, він може сортувати їх по два-двадцять.


Це був би правильний шлях, але це не вважається "кращим способом"
DS

Тому що тоді я все ще пишу своє сортування в C # або JavaScript, і здається, що це повинно бути набагато простіше і швидше в SQL. Таким чином, моє питання. Чи я просто пропускав щось очевидне чи ми застрягли, щоб написати своє власне спеціальне сортування (у C # чи JavaScript) кожне чортове додаток, над яким ми працюємо?
Шон Хенлі

3
Зачекайте, що з наборами результатів з десятками тисяч рядків? Ви не можете повернути всі ці дані клієнту. Ви повинні виконати підкачки та сортування в базі даних.
Eric Z Beard

Ядин, зрозумів. Але коли у вас є загальний сортувальник для вашої сітки, ви просто використовуєте його для всіх своїх речей.
Кевін Ферчільд,

Ерік, правда ... У таких випадках вам потрібна додаткова обробка, і, можливо, це матиме сенс у SQL. Це далеко не правильне проти неправильного питання. У деяких випадках це матиме сенс для SQL, а в деяких випадках - для клієнта.
Кевін Ферчільд,

1

Вибачте, що я запізнився на вечірку, але ось ще один варіант для тих, хто дійсно хоче уникати динамічного SQL, але бажає гнучкості, яку він пропонує:

Замість того, щоб динамічно генерувати SQL під час руху, пишіть код, щоб створити унікальну процедуру для кожного можливого варіанту. Тоді ви можете написати метод у коді, щоб переглянути параметри пошуку та запропонувати йому вибрати відповідну процедуру для виклику.

Якщо у вас є лише кілька варіацій, ви можете просто створити програми вручну. Але якщо у вас є багато варіацій, то замість того, щоб підтримувати їх усі, ви просто підтримуєте генератор Pro замість того, щоб він їх відтворив.

В якості додаткової переваги, ви отримаєте кращі плани SQL для кращої продуктивності, роблячи це і таким чином.


-1

Це рішення може працювати лише у .NET, я не знаю.

Я забираю дані в C # з початковим порядком сортування у порядку SQL за пунктом, кладу ці дані у DataView, кешую їх у змінній Session та використовую їх для створення сторінки.

Коли користувач натискає на заголовок стовпця, щоб сортувати (або сторінку, або фільтрувати), я не повертаюся до бази даних. Натомість я повертаюся до свого кешованого DataView і встановлюю його властивість "Сортувати" на вираз, який я будую динамічно, так само, як і динамічний SQL. (Я фільтрую так само, використовуючи властивість "RowFilter").

Ви можете бачити / відчувати це, як він працює в демонстраційній програмі BugTracker.NET, за адресою http://ifdefined.com/btnet/bugs.aspx


СЛАДКА! Помилка tracker.NET скелі!
digiguru

-7

Вам слід уникати сортування SQL Server, якщо це не потрібно. Чому б не сортувати на сервері додатків чи стороні клієнта? Також .NET Generics робить винятковий сорт


6
Через масштабованість. Це чудово за кілька тисяч рядків, але я не хочу знімати десять тисяч і сортувати це. Або більше. Також, що робити з пейджингом? Мені часто хочеться лише використати те, що мені потрібно показати. Сортування рядків 21-30 з 24056 за фактом було б неправильним.
Шон Хенлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.