我有两张桌子。一个有订单号,有关订单的详细信息:
CREATE TABLE #Order ( OrderID int )
,第二个包含有关订单的评论:
CREATE TABLE #OrderComments ( OrderID int
Comment VarChar(500) )
Order ID Comments
~~~~~~~~ ~~~~~~~~
1 Loved this item!
1 Could use some work
1 I've had better
2 Try the veal
我的任务是确定输出的最大长度,然后返回如下输出:
Order ID Comments Length
~~~~~~~~ ~~~~~~~~ ~~~~~~
1 Loved this item! | Could use some work | I've had better 56
2 Try the veal 12
所以,在这个例子中,如果这是所有数据,我正在寻找“56”)。
主要目的是确定附加在一起时所有注释的最大长度,包括|
分隔符。这将在构造将放入此输出的表时使用,以确定我们是否可以在the 8,060 size limit for a row内获取数据,或者我们是否需要使用varchar(max)或text来保存数据。
我已经尝试过几个子查询可以生成输出到变量,但我还没有找到一个可以生成上述输出的子查询。如果我能得到那个,那么我可以做一个SELECT TOP 1 ... ORDER BY 3 DESC
来得到我正在寻找的号码。
答案 0 :(得分:1)
如果您修剪和连接属于OrderId的所有(非空)注释,并且长度为3的分隔符,则可以找出最长字符串的长度,您可以使用
SELECT TOP(1) SUM(LEN(Comment)) + 3* (COUNT(Comment) - 1) AS Length
FROM OrderComments
GROUP BY OrderId
ORDER BY Length DESC
要实际进行连接,您可以使用XML PATH
,如本网站上的许多其他答案所示。
WITH O AS
(
SELECT DISTINCT OrderID
FROM #Order
)
SELECT O.OrderID,
LEFT(y.Comments, LEN(y.Comments) - 1) AS Comments
FROM O
CROSS APPLY (SELECT ltrim(rtrim(Comment)) + ' | '
FROM #OrderComments oc
WHERE oc.OrderID = O.OrderID
AND Comment IS NOT NULL
FOR XML PATH(''), TYPE) x (Comments)
CROSS APPLY (SELECT x.Comments.value('.', 'VARCHAR(MAX)')) y(Comments)
答案 1 :(得分:0)
您需要的只是STUFF函数和XML PATH
看看这个sql小提琴 http://www.sqlfiddle.com/#!3/65cc6/5