在 T-SQL 中追加数据

本文关键字:数据 追加 T-SQL | 更新日期: 2023-09-27 18:34:38

我有一个sql(事务处理sql - SQL server 2012(,它用于从具有有效地址的表(客户(中获取客户名称(从表详细信息(:

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

这用于每次从数据库服务器发回每个客户的每条记录(名称(行。不会提取多条记录。

最近我需要修改这个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#

??

在 T-SQL 中追加数据

我使用了上面的sql文本和"where"和"order by"子句,例如:

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) 

虽然我认为这通常是一个坏主意 - 在单个单元格中返回多个数据项 - 但有多种方法可以解决这个问题,但具有不同的性能问题。

您要查找的内容在这里:将许多行连接成一个文本字符串?