T-SQL尝试从数据库中的一组连接字符串中确定最大字符串

时间:2014-12-09 21:38:23

标签: sql-server string tsql concatenation string-concatenation

我有两张桌子。一个有订单号,有关订单的详细信息:

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来得到我正在寻找的号码。

2 个答案:

答案 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