Возвратите Top 1 из любого SQL запроса / представления / CTE - PullRequest
1 голос
/ 23 апреля 2020

Есть ли способ вернуть только ОДНУ запись, чтобы я мог получать все вызовы столбцов с помощью приведенного ниже кода?

using (var reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess).ConfigureAwait(false))
{
    DataTable dtResults = new DataTable();
    dtResults.Load(reader);

    return dtResults;
}

Так что сейчас это вернет ВСЕ X записей из запроса, и я только нужно вернуть 1 запись, чтобы я мог подключить столбцы типов данных et c. в мой элемент управления Grid.

Мы не можем просто добавить SELECT Top 1, потому что некоторые запросы начинаются с CTE et c.

Мы не можем обернуть его вокруг другого запроса, потому что иногда запрос имеет Order By s

Мы не можем заставить пользователей добавить отдельный запрос, который будет имитировать c, что мы хотим сделать.

Вот ошибка:

Сообщение 1033, Уровень 15, Состояние 1, Строка 40
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общие табличные выражения, если также не указано TOP, OFFSET или FOR XML.

Вот запрос:

SELECT TOP 1 *
FROM
    (SELECT O.Department, O.ID
     FROM dbo.table1 e
     LEFT JOIN dbo.table2 O ON e.Department = O.Department
     ORDER BY ID) x

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Если вам нужны только метаданные, используйте .ExecuteReader(System.Data.CommandBehavior.SchemaOnly)

Если вы хотите прочитать одну строку, используйте предложение OFFSET / FETCH SQL. Они добавляются в конце заявления, поэтому могут работать в вашем случае.

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15

Обратите внимание, что вы должны предоставить некоторые условия заказа.

SELECT 
    O.Department
    ,O.ID
FROM dbo.table1 e
LEFT JOIN dbo.table2 O
ON e.Department = O.Department
order by O.ID
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
0 голосов
/ 23 апреля 2020

sp_describe_first_result_set должен делать то, что вы хотите. Он вернет метаданные для рассматриваемой команды.

exec sp_describe_first_result_set @tsql = N'SELECT O.Department, O.ID
 FROM dbo.table1 e
 LEFT JOIN dbo.table2 O ON e.Department = O.Department
 ORDER BY ID'  
0 голосов
/ 23 апреля 2020

Подзапрос просто не нужен. Вы можете использовать top (1) и order by непосредственно во внешнем запросе:

select top(1) o.department, o.id
from dbo.table1 e
left join dbo.table2 o on e.department = o.department
order by id
0 голосов
/ 23 апреля 2020

Попробуйте следующее, вы не можете использовать Order by с подзапросом на SQL сервере.

select top 1 * 
from 
(
    SELECT 
        O.Department
        ,O.ID
    FROM dbo.table1 e
    LEFT JOIN dbo.table2 O
    ON e.Department = O.Department
) 
Order by  
    ID
...