Сценарий сначала запускает дорогой отсортированный запрос и сохраняет первые 100 000 первичных ключей (Int32) в списке .NET.Затем извлекайте детали по 100 строк за раз из десятка таблиц.Формат подробного запроса:
select ... from DetailA where PK in (sorted list of 100 PK).
Проблема в том, что возврат не отсортирован по порядку в предложении in.Нужна деталь для сортировки.Не хочу применять сортировку, которая использовалась для создания 100 000 главных списков, поскольку это дорогая и грязная сортировка.
Моя мысль - загрузить 100 PK в таблицу #tempSort и использовать ее для сортировки.Есть ли лучший подход?
В настоящее время получение детализации по одной строке за раз с использованием SQLDataReader, и это занимает около 2 секунд.Протестировано получение всего сразу с использованием DataSet с несколькими DataTables, и это было медленнее, чем одна строка за раз с использованием SQLDataReader в 3 раза. Эти данные загружаются в объекты, поэтому необходимы расширенные функции DataSet.
Я не хочу сохранять 100 000 основных результатов в #temp, поскольку это большая активная база данных и необходимо перенести нагрузку на клиент.
Попытка параметров табличного значения в соответствии с рекомендациями.
Это правильный синтаксис?
CREATE TYPE sID100 AS TABLE
( sID INT, sortOrder INT );
GO
/* Declare a variable that references the type. */
DECLARE @sID100 AS sID100;
/* Add data to the table variable. */
INSERT INTO @sID100 (sID, sortOrder)
values (100, 1), (200,2), (50,3);
Select * from @sID100;
select docSVsys.sID, docSVsys.addDate
from docSVsys
join @sID100 as [sID100]
on [sID100].sID = docSVsys.sID
order by [sID100].sortOrder
GO
Drop TYPE sID100
Выше не является оптимальным.Я учусь, но в C # можно создать DataTable и передать его в хранимую процедуру, используя параметры Tabel-Value.Именно то, что сказал Мартин в комментарии, но потребовалось некоторое исследование, чтобы я понял его слова.