我的数据库中有一个文本字段:
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它应该能够用于列表中的任意数量的项目。
答案 0 :(得分:0)
试试这个。将字符串分成几部分。
第一部分 - This is a list:
第二部分 - 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
答案 1 :(得分: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