0

我的数据库中有一个文本字段:

DECLARE @vchText varchar(max) = 
 This is a string<>Test1<>Test2<>Test

@vchText 参数应返回如下:

  This is a string: 

     1. Test1    
     2. Test2 
     3. Test

任何人都想出一个纠正这个问题的好方法。我在想带有 WHILE LOOP 的 STUFF 和 CHARINDEX 函数......?

我还应该注意的是,列表中可能不仅有 1,2,3 项,可能还有更多,所以我无法构建它,所以它是静态的,只能处理 1,2,3 它应该能够适用于列表中的任意数量的项目。

4

2 回答 2

0

尝试这个。把绳子分成几部分。

  1. 第一部分 -This is a list:

  2. 第二部分 -1.Test1 1.Test2 1.Test3

使用分隔符将第二部分转换为行Space。然后添加row_number到行。追加row_number和 列数据。

最后将不同的行转换为由分隔的单行space并将其附加到first part

DECLARE @NOTE   VARCHAR(max) = 'This is a list: 1.Test1 1.Test2 1.Test3',
        @temp   VARCHAR(max),
        @output VARCHAR(max)

SELECT @temp = Substring(@NOTE, Charindex(':', @NOTE) + 2, Len(@note))

SELECT @output = LEFT(@NOTE, Charindex(':', @NOTE) + 1)

SELECT @output += CONVERT(VARCHAR(10), Row_number() OVER (ORDER BY col))
                  + Substring(col, Charindex('.', col), Len(col))
                  + ' '
FROM   (SELECT Split.a.value('.', 'VARCHAR(100)') col
        FROM   (SELECT Cast ('<M>' + Replace(@temp, ' ', '</M><M>') + '</M>' AS XML) AS Data) AS A
               CROSS APPLY Data.nodes ('/M') AS Split(a)) ou

SELECT @output -- This is a list: 1.Test1 2.Test2 3.Test3 
于 2014-11-30T16:33:01.120 回答
0

我能够通过循环来做到这一点,并使用下面的东西和 charindex。

    DECLARE @vchText varchar(max) = 
 This is a string<>Test1<>Test2<>Test


DECLARE @positionofNextX INT = CHARINDEX('<>', @vchText)
DECLARE @nbrOFListItems INT = 1

WHILE @positionofNextX  != 0
BEGIN
    SET @NOTE = STUFF( @vchText, @positionofNextX, 4, CAST(@nbrOFListItems AS VARCHAR(1)) + '. ')

    SET @positionofNextX  = CHARINDEX('<>',  @vchText)

    --increment the list item number
    SET @nbrOFListItems = @nbrOFListItems + 1
END

print  @vchText
于 2014-12-03T15:40:30.040 回答