Я использую SQL для объединения строк.
Это утверждение работает:
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
Person p
ORDER BY
p.SortOrder
И я получаю список имен, таких как:
Name1, Name2, Name3
Теперь я хочу добавить в возможно нулевое поле фамилии для каждого из этих людей. Я попробовал sql ниже, но я получаю только последний элемент в списке (Name3
):
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
Person p
ORDER BY
p.SortOrder
НО, если я сначала вставлю все эти имена во временную таблицу, то все будет работать как положено:
CREATE TABLE #Person2
(
FirstName nvarchar(128) NOT NULL
,LastName nvarchar(256) NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, LastName, SortOrder) (
SELECT p.FirstName, p.LastName, p.SortOrder FROM Person p)
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
#Person2 p
ORDER BY
p.SortOrder
DROP TABLE #Person2
Так в чем же разница между приведенным выше утверждением относительно исходной таблицы и приведенным для временной таблицы? Маршрут временных таблиц работает, и я собираюсь его использовать, но мне очень любопытно ... что мне здесь не хватает?
ОБНОВЛЕНО ВОЗМОЖНЫМ РЕШЕНИЕМ
См. @ ответ Мартина , но конкатенация строк не гарантируется. Таким образом, решение заключается в том, чтобы сначала вставить фамилию во временную таблицу до выбора списка имен:
CREATE TABLE #Person2
(
FirstName nvarchar(256) NOT NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, SortOrder) (
SELECT p.FirstName + ISNULL(' ' + p.LastName, ''), p.SortOrder
FROM Person p
)
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
#Person2 p
ORDER BY
p.SortOrder ASC