Как создать функцию, которая бы перечисляла несколько значений отношений в одной строке (SQL Server 2014) - PullRequest
0 голосов
/ 24 мая 2019

db Northwind

Я должен создать новую функцию, которая возвращает все продукты (таблица Products) для определенного Заказа (представление [Order Details]) в одну строку, разделенные запятыми, НО IЯ не должен использовать FOR XML PATH, как я уже сделал.Мой тренер предложил, чтобы мой @ProductName вложил все названия продуктов, но я не знаю, как вернуться в одну строку, не используя FOR XML PATH.Пожалуйста, посмотрите на код.

alter Function FunctionName(@OrderID int)
returns nvarchar(max)
as
begin
  declare @ProductName nvarchar(max);

  select @ProductName = (
    SELECT p.ProductName + ',' 
    FROM Products p
    join [Order Details] od on p.ProductID = od.ProductID
    where @OrderID = od.orderID 
    group by p.ProductID, p.ProductName
    FOR XML PATH('')
  )
  return @ProductName;
END;

1 Ответ

2 голосов
/ 24 мая 2019

Я думаю следующее делает то, что вы хотите:

declare @ProductName nvarchar(max);

select @ProductName = coalesce(@ProductName + ',', '') + p.ProductName 
from Products p join
     [Order Details] od
     on p.ProductID = od.ProductID
where @OrderID = od.orderID ;

return @ProductName;

Я не рекомендую эту конструкцию, потому что я не уверен на 100%, что на самом деле она гарантированно работает правильно (и я не знаю предупреждений против нее). На практике, однако, это работает.

Однако ваш тренер не должен побуждать вас искать хитрости в языке. Вместо этого он должен рассказать вам о string_agg(), который доступен начиная с SQL Server 2017.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...