Преобразовать набор результатов SQL Server в строку - PullRequest
39 голосов
/ 27 января 2011

Я получаю результат в SQL Server как

SELECT StudentId FROM Student WHERE condition = xyz

Я получаю вывод как

StudentId
1236

7656

8990
........

Выходной параметр хранимой процедуры - @studentId строка, и я хочу, чтобы оператор возврата был

1236, 7656, 8990.

Как я могу преобразовать вывод в одну строку?

Я возвращаю один столбец [т.е. StudentId]

Ответы [ 8 ]

56 голосов
/ 27 января 2011
DECLARE @result varchar(1000)

SELECT @result = ISNULL(@result, '') + StudentId + ',' FROM Student WHERE condition = xyz

select substring(@result, 0, len(@result) - 1) --trim extra "," at end
44 голосов
/ 27 января 2011

Проверьте это:

 DECLARE @result NVARCHAR(MAX)

 SELECT @result = STUFF(
                        (   SELECT ',' + CONVERT(NVARCHAR(20), StudentId) 
                            FROM Student 
                            WHERE condition = abc 
                            FOR xml path('')
                        )
                        , 1
                        , 1
                        , '')
8 голосов
/ 03 октября 2011

Используйте функцию COALESCE:

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
7 голосов
/ 27 января 2011

Оба ответа верны, но не забывайте инициализировать значение переменной, по умолчанию NULL и с T-SQL:

NULL + "Any text" => NULL

Это очень распространенная ошибка, не забывайтеit!

Также рекомендуется использовать функцию ISNULL:

SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student
1 голос
/ 29 марта 2017

Используйте функцию CONCAT, чтобы избежать ошибок преобразования:

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
0 голосов
/ 20 июня 2018

Неправильный ответ из brad.v !Это не даст вам объединенную строку.

Вот правильный код, почти как brad.v , но с одним важным изменением:

DECLARE @results VarChar(1000)
  SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE @results + ', ' + CONVERT( VarChar(20), [StudentId])
  END
FROM Student WHERE condition = abc;

См.различия?:) brad.v Пожалуйста, исправьте свой ответ, я ничего не могу сделать, чтобы исправить или прокомментировать это, потому что моя репутация здесь равна нулю.Я думаю, что смогу убрать мою после того, как ты исправишь свою.Спасибо!

0 голосов
/ 12 декабря 2016

Это работает со значениями NULL в таблице и не требует подстроки в конце. COALESCE не очень хорошо работает со значениями NULL в таблице (если они будут там).

DECLARE @results VARCHAR(1000) = '' 
SELECT @results = @results + 
           ISNULL(CASE WHEN LEN(@results) = 0 THEN '' ELSE ',' END + [StudentId], '')
FROM Student WHERE condition = xyz

select @results
0 голосов
/ 27 января 2011

или один оператор выбора ...

DECLARE @results VarChar(1000)
SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE ', ' + CONVERT( VarChar(20), [StudentId])
   END
FROM Student WHERE condition = abc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...