Проблема с порядком по FOR XML в T-sql (предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах)
select a.Hall, a.Title, STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) + ']' FROM (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' ) b Where a.Hall = b.Hall and a.Title = b.Title FOR XML PATH('')),1,1,'') As ShowTime from (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' Order by a.StartFilmTime ) a group by a.Hall, a.Title
Я получаю сообщение об ошибке:
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если не указано значение TOP или FOR XML.
Помоги пожалуйста! (Я использовал FOR XML
?)
- добавление атрибута к тому же тегу в xml в sql-сервере
- Обновление существующей таблицы temp с идентификатором, созданным во время установки вставки
- Обновление таблицы SQL Server с помощью XML
- Разделить результаты XML PATH на отдельные строки
- Пустое пространство имен xml в дочерних узлах SQL Server
- Разделить единое значение XML в несколько строк в SQL
- Как использовать Mirth для вставки данных в базу данных SQL Server из XML-файла
- Как преобразовать строку в формате «свойство: значение, свойство2: значение» в xml в SQL Server 2008
- XML-сериализация и для xml-сервера
- t-sql XML обрабатывает несколько записей с событиями, данными и стоимостью
- Декодировать текст из запроса XML XML Sql
- SQL Server с XML и выбор дочерних узлов
- пользовательский xml и sql-сервер
Хотя в вашем запросе используется FOR XML
(для обходного пути GROUP_CONCAT
), вы применяете порядок за пределами производной таблицы, использующей FOR XML
, и, следовательно, ошибку.
Учитывая, что вы не включаете дату начала непосредственно в окончательный выбор (хотя вы составляете его как часть столбца STUFF ShowTime
), вы также не можете ORDER BY StartFilm
в финальной группе GROUP BY
, поскольку в противном случае столбец для включения в GROUP BY
или в виде агрегированного столбца.
Что вы можете сделать, так это переместить ORDER BY
в STUFF, а затем упорядочить по производному столбцу ShowTime
(так как ваш запрос работает только в течение одного заданного дня, а StartFilmTime является первой частью столбца, состоящего из STUFFED
).
В то же время я бы СУЩЕСТВУЕТ повторение на производной таблице с помощью CTE:
WITH cteFiltered AS (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' ) select a.Hall, a.Title, STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) + ']' FROM cteFiltered b Where a.Hall = b.Hall and a.Title = b.Title order by b.StartFilm -- *** FOR XML PATH('')),1,1,'') As ShowTime from cteFiltered a group by a.Hall, a.Title order by ShowTime; -- *** Hour is first (assuming 24H format) and only one day