Вставить результат выбора в переменную с помощью Order By - PullRequest
0 голосов
/ 06 мая 2019

Данные

Approval_ID
-----------
1
2
3
4
5
6
7
8
9
10

Запрос

DECLARE 
    @id varchar(8000)

SELECT  @id = COALESCE(@id + ', ', '') + '[' +  Approval_ID  + ']'
FROM (
   SELECT DISTINCT Approval_ID
   FROM Gate_III_CS_Approval
) Y

Результат всегда

1,10,2,3,4,5,6,7,8,9

Я пытался добавить Order By

ORDER BY len(Approval_ID), Approval_ID

но есть ошибка

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

и я хочу получить такой результат

1,2,3,4,5,6,7,8,9,10

Что мне делать?

Обновление:

   ;with cte as (
        SELECT DISTINCT Approval_ID
        FROM Gate_III_CS_Approval
    )

    SELECT @id = STUFF(
                    (SELECT concat(',', '[' + Approval_ID + ']') 
                        FROM cte ORDER BY len(Approval_ID), Approval_id
                        FOR XML PATH('')
                    ), 1, 1, '')

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

Использование CTE и STUFF for XML PATH

-- replace CTE with your table, this is only an example

declare @id varchar(8000) 

;with cte as (
 select 1 n 
 union all
 select n+1 n from
   cte 
   where n < 10
)
select @id = 
   STUFF((
            SELECT concat(',', n)
            FROM cte
            order by n
            FOR XML PATH('')
            ), 1, 1, '')



select @id

programmatically cast n from alphanumeric to int for sorting

1 голос
/ 06 мая 2019

Кажется, вы используете поле varchar вместо целого числа для Approval_ID.

Для заказа на основе поля varchar, вы можете попробовать метод из ответа maSTAShuFu.

Здесь я обновляю ваш запрос из вопроса.

SELECT STUFF(
    (SELECT CONCAT(',[', Approval_ID,']')
     FROM <your_table>
     ORDER BY cast(Approval_ID as int)
        FOR XML PATH('')), 1, 1, '')
1 голос

Возможно, вы можете попытаться преобразовать varchar в int для этой цели. Я построил пример здесь

DECLARE 
        @id varchar(8000)
    SELECT  @id = COALESCE(@id + ', ', '') + '[' +  CAST(ID AS VARCHAR(10))  + ']'
    FROM (
       SELECT DISTINCT CAST(id AS INT) ID
       FROM TABLA   
    ) Y

    SELECT  @ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...