2014-12-18 2 views
0

У меня есть SQL (Transact SQL - SQL сервер 2012), который используется для извлечения имен пользователей из таблицы (Заказчик), который имеет действительные адреса (из таблицы детали):добавляющих данные в T-SQL

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# 

??

+0

проверить этот "моделирование" из GROUP_CONCAT: http://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group-concat-in-sql-server –

ответ

2

Я использовал вышеуказанный текст 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) 

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

+0

Я положил order by после Split (a) теперь, и он работает, но он порождает другую ошибку: синтаксический анализ XML: строка 1, символ 23, недопустимый символ имени –

0

попробовать это:

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) 
+0

я я получаю значение в наборе данных с сервера через программирование на C#. Но код выше для xml ... не так ли? !! pardon me, я не очень хорошо разбираюсь в sql .... –

+0

@SomdipDey это для SQL SERVER –

+0

@SomdipDey в C# вы можете разделить строку и u получите желаемый op –

0

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

Что вы ищете здесь: Concatenate many rows into a single text string?

Смежные вопросы