Преобразование результата SQL Server в строку
Я получаю результат в SQL Server как
SELECT StudentId FROM Student WHERE condition = xyz
Я получаю вывод как
StudentId
1236
7656
8990
........
Выходным параметром хранимой процедуры является строка @studentId
, и я хочу, чтобы оператор return
1236, 7656, 8990.
Как преобразовать вывод в одну строку?
Я возвращаю один столбец [т.е. StudentId]
Ответы
Ответ 1
Проверьте это:
DECLARE @result NVARCHAR(MAX)
SELECT @result = STUFF(
( SELECT ',' + CONVERT(NVARCHAR(20), StudentId)
FROM Student
WHERE condition = abc
FOR xml path('')
)
, 1
, 1
, '')
Ответ 2
DECLARE @result varchar(1000)
SET @result = ''
SELECT @result = @result + StudentId + ',' FROM Student WHERE condition = xyz
select substring(@result, 0, len(@result) - 1) --trim extra "," at end
Ответ 3
Оба ответа действительны, но не забудьте инициализировать значение переменной, по умолчанию это NULL и T-SQL:
NULL + "Any text" => NULL
Это очень распространенная ошибка, не забывайте!
Также неплохо использовать функцию ISNULL:
SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student
Ответ 4
Используйте функцию COALESCE
:
DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
Ответ 5
Используйте функцию CONCAT
, чтобы избежать ошибок преобразования:
DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
Ответ 6
или один оператор select...
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;
Ответ 7
Это работает с 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