Я извиняюсь за это решение быть педантичным, но У меня есть трудное время и нужно следить за шагами. Кроме того, Microsoft добавляет функцию, чтобы сделать это в выпуске 2012 года, но этот код должен работать в большинстве выпусков. Во-первых, использовать базу данных, открытую для пользователей в большинстве SQLServers ...
USE MASTER; SELECT TOP 3 TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS;
/*TABLE_NAME COLUMN_NAME ORDINAL_POSITION
spt_fallback_db xserver_name 1
spt_fallback_db xdttm_ins 2
spt_fallback_db xdttm_last_ins_upd 3
*/
Теперь, ломая этот подход (для сортировки списка в пределах столбца) ...
(1) Добавление FOR XML PATH (» «) для запроса в 1 колонку вращает его в один ряд, но добавляет XML-тег для заголовка столбца ...
SELECT TOP 3 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS FOR XML PATH('');
/*<COLUMN_NAME>xserver_name</COLUMN_NAME><COLUMN_NAME>xdttm_ins</COLUMN_NAME><COLUMN_NAME>xdttm_last_ins_upd</COLUMN_NAME>*/
(2) Concatination аннулирует заголовок столбца, устранение меток. Любая строка будет работать, я хочу запятая пространство ...
SELECT TOP 3 ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS FOR XML PATH('');
/*, xserver_name, xdttm_ins, xdttm_last_ins_upd*/
(3) Другие столбцы будут нужны свои собственные SELECT, поэтому FOR XML должен быть подзапрос и ORDER BY является юридическим Приставка в FOR XML подзапрос;) ...
SELECT TOP 2 TABLE_NAME
, (SELECT ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
ORDER BY ORDINAL_POSITION FOR XML PATH('')
) LIST_OF_COLUMNS
FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME;
/*TABLE_NAME LIST_OF_COLUMNS
spt_fallback_db , xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_dbid, name, dbid, status, version
spt_fallback_dev , xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_low, xfallback_drive, low, high, status, name, phyname
*/
(4) Наконец, SUBSTRING более знакома мне, чем STUFF для удаления известного префикса ...
SELECT TOP 2 TABLE_NAME
, SUBSTRING((SELECT ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
ORDER BY ORDINAL_POSITION FOR XML PATH('')
)
, 2+1--Add 1 to start substring after the first 2 characters
, 99999) LIST_OF_COLUMNS
FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME;
/*TABLE_NAME LIST_OF_COLUMNS
spt_fallback_db xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_dbid, name, dbid, status, version
spt_fallback_dev xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_low, xfallback_drive, low, high, status, name, phyname
*/
Pedantically yours - Jim Gettman
Я попытался, что, к сожалению, возвращающая следующая erro r: Msg 145, Level 15, State 1, Line 1 Элементы ORDER BY должны быть указаны в списке выбора, если указан параметр SELECT DISTINCT. Поэтому я попытался упорядочить с помощью [text()], который не работает, потому что он упорядочивает созданную строку, которая возвращает тот же результат, что и в исходном вопросе. – BigDevJames
Как насчет ** ORDER BY CAST (Fights.FightNumber AS VARCHAR (MAX)) **? –
Я отредактировал приведенный выше код, попробуйте. сначала я делаю разные, а затем обертываю его другим sql. Поскольку у меня нет данных, я не могу проверить это, дайте мне знать, если это сработает. – Sagar