При объединении с использованием COALESCE число более 9 отображается звездочкой * - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу объединить значения из нескольких строк в одну.Я использую COALESCE для этой цели.Один из столбцов, который у меня есть, это столбец идентификаторов.При объединении столбца идентификатора значения до 9 отображаются корректно, но после девяти отображается звездочка.Кто-нибудь знает, почему это?Посмотрите мой код ниже, используя COALESCE для объединения всех строк в одну:

CREATE TABLE #test
(id int, name varchar(50))
insert into #test
values(1, 'ana'),
(2, 'bob'),
(3, 'steph'),
(4, 'bill'),
(5, 'john'),
(6, 'jose'),
(7, 'kerry'),
(8, 'frank'),
(9, 'noah'),
(10, 'melissa')

--SELECT * FROM #test 

DECLARE @NameAndID VARCHAR(1000)
SELECT @NameAndID = COALESCE(@NameAndID +'; ', '') + CAST(ID AS VARCHAR(1))+'. ' + name
FROM #test 

SELECT @NameAndID

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

* является индикатором того, что длина результата (была) слишком мала для отображения . В вашем примере вы пытаетесь вписать двузначное число в VARCHAR(1). В данном конкретном случае результатом является * вместо выдачи ошибки.

Поведение описано в документации .

0 голосов
/ 10 ноября 2018

Вы приводите число к varchar(1) - и любое число, состоящее более чем из одной цифры, переполняет один символ и поэтому превращается в звездочки (*).

При приведении целочисленных значений лучше всего использовать varchar(11), поскольку он охватывает максимальное количество символов, которое может потребоваться для отображения целого числа.
Минимальное значение int равно -2 147 483 648 - для удаления разделителей тысяч используются 10 цифр и знак минуса:

-2147483648
123456789 1 (10 is missing in the chars count to make it more clear)

Кстати, в T-Sql есть лучшие способы агрегирования строк.

Для версий до 2017 года используйте комбинацию stuff и for xml path, например:

SELECT STUFF(
    (
        SELECT '; ' + CAST(id as varchar(11)) + '. ' + name
        FROM #test
        FOR XML PATH('')
    ),1 ,2, '')

Для версии 2017 или выше используйте встроенную функцию string_agg, например:

SELECT STRING_AGG(CAST(id as varchar(11)) + '. '+ name, '; ')
FROM #Test

для получения дополнительной информации, прочитайте этот пост.

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