Я использую ADO DataReader для получения строк с сервера sql. Поскольку DataReader не имеет счетчика записей, мне нужно самому получить счетчик записей. Итак, в моем случае я хочу поместить исходный оператор sql, который передается динамическому классу, в подзапрос.
Пример
SELECT
id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
должно быть
SELECT COUNT(*)
FROM (
SELECT id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title)t
В этом случае нам нужно изменить оператор SQL, потому что синтаксис требует добавления TOP 100 PERCENT для правильной работы:
SELECT COUNT(*)
FROM (SELECT TOP 100 PERCENT id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title)t
Итак, я сделал это:
int fromIndex = this.SQL.IndexOf("SELECT",
StringComparison.CurrentCultureIgnoreCase);
String countSql = "SELECT TOP 100 PERCENT" +
this.SQL.Substring(fromIndex + 6);
countSql = "SELECT COUNT(*) FROM (" + countSql + ")t";
Но что, если в исходном заявлении уже есть предложение TOP, например
SELECT TOP 5 id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
или даже хуже
SELECT TOP 5
id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
Так что мой код должен с этим справиться.
Кстати: если у кого-то есть гораздо более лучший подход к подсчету записей из любого оператора SQL, этот ответ также приветствуется!
ИЗМЕНИТЬ, чтобы прояснить мой вопрос. Ссылка Как получить количество строк с помощью SqlDataReader в C # объясняет, как это сделать. Я читал это. Мой вопрос в том, как обрабатывать входящий оператор SQL, чтобы добавить предложение TOP 100 PERCENT
или нет.