Добавление данных в T-SQL

У меня есть sql (transact sql-SQL server 2012), который использовался для извлечения имен клиентов из таблицы (Customer), у которой есть действительные адреса (из таблицы Details):

Select Customer.Name, Details.Address from Customer left outer join Details on Details.Customer = Customer.Name 

Это используется для каждой строки каждого имени (имени) для каждого клиента каждый раз с сервера db. Нет нескольких записей.

Недавно мне нужно было изменить этот текст sql, чтобы получить даже имя книг, которые они заимствовали в соответствии с базой данных, которая сохраняется в другой таблице (кредитование). Теперь сценарий выглядит так:

 Select Customer.Name, Details.Address, Lending.BookName from Customer left outer join Details on Details.Customer = Customer.Name left outer join Lending on Lending.CustomerName = Customer.Name 

Он правильно возвращает записи, но теперь у меня проблема. Поскольку клиент может брать несколько книг, возвращаемые данные имеют несколько строк для одного и того же клиента, отображающих несколько имен книг. Согласно моей спецификации программного обеспечения мне нужно получить одну строку для каждого клиента, и в этой строке мне нужно добавить все имена книг в одном столбце. Может ли кто-нибудь помочь мне в этом: как добавить несколько данных для одной записи в одном столбце, например:

 Name Address BookName Somdip XX Brief History of Time,Headfirst SQL,Headfirst C# 

вместо

 Name Address BookName Somdip XX Brief History of Time Somdip XX Headfirst SQL Somdip XX Headfirst C# 

??

Я использовал вышеупомянутый текст sql с предложениями «где» и «заказывать по», например:

 SELECT Name, Address , Split.a.value('.', 'VARCHAR(100)') BookName FROM (SELECT Name, Address , Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data FROM [table] where ID = '1' order by Name) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) 

и это дает мне ошибку: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если не указано значение TOP, OFFSET или FOR XML.

попробуй это:

 SELECT Name, Address , Split.a.value('.', 'VARCHAR(100)') BookName FROM (SELECT Name, Address , Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data FROM [table]) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) 

Хотя я думаю, что это, как правило, плохая идея – возврат нескольких элементов данных в одну ячейку – есть несколько способов сделать это, с различными проблемами производительности.

Что вы ищете здесь: объединить много строк в одну текстовую строку?