Я не знаю, задавался ли этот вопрос раньше. Но у меня есть проблема при конкатарировании varchars.
Позвольте мне объяснить:
У меня есть эта таблица:
CREATE TABLE Table1
(
[Field] [varchar](10) NOT NULL
)
INSERT INTO Table1
VALUES('1'),('2'),('3'),('4'),('5'),('TITLE')
И мне нравится, чтобы вывод был таким:
'[TITLE],[1],[2],[3],[4],[5]'
Я хочу, чтобы 'TITLE' был первым, а затем 1,2,3,4,5
Таким образом, этот запрос вернет упорядоченный результат. У меня не больше цифр, чем длина 'TITLE'
SELECT
*
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
Тогда я обычно кончарую вархар так:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
Но это возвращение:
'[5]'
То, что я нахожу, действительно странно. Может кто-нибудь объяснить, почему?
Я знаю, что есть альтернативное решение для контингента varchar. Как это:
DECLARE @cols VARCHAR(MAX)
SELECT @cols=STUFF
(
(
SELECT
',' +QUOTENAME([Field])
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
FOR XML PATH('')
)
,1,1,'')
Это вернет мой ожидаемый результат следующим образом:
'[TITLE],[1],[2],[3],[4],[5]'
EDIT
Предположение, что @cols
равно нулю, в начале не может быть. Прошу, если я уберу order by
. Как это:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
Мой результат будет таким:
'[1],[2],[3],[4],[5],[TITLE]'
EDIT1
Это не будет работать:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM(
SELECT [Field]
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
) AS t
Потому что он выдаст сообщение об исключении, подобное этому:
Сообщение 1033, уровень 15, состояние 1, строка 17 Предложение ORDER BY недопустимо в
представления, встроенные функции, производные таблицы, подзапросы и общая таблица
выражений, если не указан TOP или FOR XML.
EDIT2
Как я и ожидал. Я не могу сделать это:
SELECT @cols, @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
Поскольку это вызовет исключение, подобное этому:
Сообщение 141, Уровень 15, Состояние 1, Строка 9 Оператор SELECT, который назначает
значение переменной не должно сочетаться с извлечением данных
операции.