私の推測では、問題のあるNULL
s はSOD.SalesOrderId
.
One way to handle them is by filtering them out:
SELECT P.Name,
STUFF (( SELECT ' | ' + CONVERT(VARCHAR(22) , SOD.SalesOrderID)
FROM Sales.SalesOrderDetail SOD
WHERE
P.ProductID = SOD.ProductID and SOD.SalesOrderId is not null
FOR XML PATH ('')
), 1, 1, '')
as Orders
FROM Production.Product P
別の方法は、それらを受け入れ可能な表現に変換することです。
SELECT P.Name,
STUFF (( SELECT ' | ' + coalesce(CONVERT(VARCHAR(22) , SOD.SalesOrderID), '<NULL>')
FROM Sales.SalesOrderDetail SOD
WHERE
P.ProductID = SOD.ProductID
FOR XML PATH ('')
), 1, 1, '')
as Orders
FROM Production.Product P
編集:
一致するレコードがないため、NULL
が返されています。SalesOrderDetail
この場合、何を返してほしいですか?
これらの製品を見つけるには:
select p.*
from Production.Product p left outer join
Sales.SalesOrderDetail sod
on p.ProductID = SOD.ProductID
where sod.ProductId is null;
それらを除外する場合は、サブクエリを使用します。
select t.*
from (<either of the above queries>) t
where t.Orders is not NULL
編集II:
空白を返す場合は、値をラップcoalesce()
します。
SELECT P.Name,
coalesce(STUFF (( SELECT ' | ' + CONVERT(VARCHAR(22) , SOD.SalesOrderID)
FROM Sales.SalesOrderDetail SOD
WHERE
P.ProductID = SOD.ProductID
FOR XML PATH ('')
), 1, 1, ''), '')
as Orders
FROM Production.Product P