MS SQL + выходной запрос в виде строки с разделителями

Я не уверен, правильно ли я понимаю пример, найденный... или я делаю что-то еще неправильно здесь... но я пытаюсь получить результаты моего запроса, возвращаемые как:

1.) Одна длинная строка с разделителями 2.) Удалить завершающий разделитель в конце возвращаемых данных

В таблице есть несколько столбцов, но я ТОЛЬКО беру идентификатор и НАЗВАНИЕ КОМПАНИИ.

Я работаю над результатом: ID0|NAME0|ID1|NAME1|ID2|NAME2... и т. д..

Используя это:

SELECT (ID + '|' + COMPANY + '|') AS ORGLIST 
FROM vw_PreferredMail
WHERE member_type = 'CTR' 
ORDER BY ID 

Я получаю:

ID0|ИМЯ0 ID1|ИМЯ1 ID2|ИМЯ2

все в свои ряды..

Используя это:

DECLARE @OrgResults varchar(255)
SELECT @OrgResults = ID + '|' + COMPANY
FROM vw_PreferredMail
WHERE member_type = 'CTR' 
ORDER BY ID 
SELECT SUBSTRING(@OrgResults, 1, LEN(@OrgResults) - 1);

Я получаю только ПОСЛЕДНЮЮ строку.

Как я могу заставить все это находиться в одной "строке" с разделителями.. (при обрезке последнего разделителя? Или сначала, если его нужно изменить?)

Обновлять:

Этот подход "кажется" работает... (в настоящее время проверяет SSMS).. перед добавлением моего реального проекта

SELECT (ID + '|' + COMPANY)
FROM vw_PreferredMail
WHERE member_type = 'CTR'
ORDER BY ID 
FOR XML PATH('');

Результаты выглядят как «ссылка» в SSMS (SQL Server Management Studio).. но кажутся полными..

Это приемлемое использование выше?


person whispers    schedule 06.04.2018    source источник
comment
Используете ли вы Oracle или SQL Server или что-то другое?   -  person Meow Meow    schedule 06.04.2018


Ответы (2)


Вы были близки изначально; простая ошибка, вы не сохраняете значение @OrgResults, вы его заменяете.

Вы делаете @OrgResults=..., а не @OrgResults=@OrgResults+.... Вам также необходимо установить @OrgResults='' перед началом объединения, иначе вы получите результат NULL.

Быстрая починка:

DECLARE @OrgResults varchar(255)
SET @OrgResults=''

SELECT @OrgResults = @OrgResults + ID + '|' + COMPANY + '|'
FROM vw_PreferredMail
WHERE member_type = 'CTR' 
ORDER BY ID 

SET @OrgResults = LEFT(@OrgResults, LEN(@OrgResults)-1);
SELECT @OrgResults

Имейте в виду, 255 — это немного, вы можете начать усекать. Возможно, вам придется растянуть это.

person Dave Cullum    schedule 07.04.2018

Вы не указали, какой SQL вы используете, но если бы это был MySQL, я бы сделал следующее, чтобы получить результаты в той же строке с форматированием, которое вы хотели:

SELECT concat(concat(concat(id ,"|"),COMPANY ),"|") AS ORGLIST 
FROM vw_PreferredMail
WHERE member_type = 'CTR' 
ORDER BY ID 

Дайте нам знать ваши требования и версию SQL в деталях, чтобы мы могли изменить.

person stackFan    schedule 06.04.2018
comment
Извините... Я думал, что заголовок прояснил бы это... Я использую SQL. Это НЕ MySQL или Oracle, просто MS SQL - person whispers; 06.04.2018
comment
MS SQL Я не уверен в версии.. но моя установка SSMS довольно старая. SSMS 2005 все еще... должна быть обновлена ​​к концу месяца, говорит отдел!).. CONCAT не является допустимой функцией в настоящее время.. (изменение этого на просто +.. дает те же результаты, что и мой первоначальный пример, опубликованный выше. Добавление XML PATH() дает мне список, подобный моему обновлению выше. - person whispers; 06.04.2018
comment
@whispers: SQL — это язык запросов, а не название конкретного продукта СУБД. Каждая реляционная база данных является базой данных SQL. - person a_horse_with_no_name; 06.04.2018