我在SQL中有一个字符串存储在类型为@result
的{{1}}变量中,如下所示:
Varchar(MAX)
如何在不影响存储过程性能的情况下得到相反的结果。我希望在Attributes >> Items >> Category >> Package
的基础上打破字符串。
>>
答案 0 :(得分:3)
如果字符串中最多有四个项目且没有包含句点,则可以使用PARSENAME()
。
select (parsename(replace(@result, ' >> ', '.'), 1) + ' >> ' +
parsename(replace(@result, ' >> ', '.'), 2) + ' >> ' +
parsename(replace(@result, ' >> ', '.'), 3) + ' >> ' +
parsename(replace(@result, ' >> ', '.'), 4)
)
另一种选择是拆分字符串并重新构建它。
答案 1 :(得分:1)
使用分隔符>>
将row_number分配到每一行,将字符串分成不同的部分。
然后Convert the rows into single string
由>>
命令以desc分隔。
如果你有超过4个元素
,这应该有效DECLARE @output VARCHAR(5000)='',
@String VARCHAR(5000)='Attributes >> Items >> Category >> Package'
SELECT @output += splt_data + ' >> '
FROM (SELECT Row_number()
OVER(
ORDER BY (SELECT NULL)) rn,
Rtrim(Ltrim(Split.bb.value('.', 'VARCHAR(100)'))) splt_data
FROM (SELECT Cast ('<M>' + Replace(@String, '>>', '</M><M>')
+ '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(bb)) ou
ORDER BY rn DESC
输出:
SELECT LEFT(@output, Len(@output) - 3) --Package >> Category >> Items >> Attributes
答案 2 :(得分:-3)
如果您正在运行SQL Server 2008或更高版本,请尝试:
Select Reverse(@result)