在Sql 服务器中解析特定格式字符串的优化

Optimization of parsing a specific format string in Sql Server

我需要解析传递给存储过程的消息。消息的格式可能类似于 ##tag##message

我在 sproc 中写了一些行,基本上可以完成这项工作,但我正在寻求优化它的方式,以便尽可能删除额外的变量声明。

DECLARE @message VARCHAR(255)='##cloud##this is a cloud related message';
DECLARE @temp VARCHAR(255)
DECLARE @i INT
DECLARE @searchTag VARCHAR(255)
IF  SUBSTRING(@message,1,2)='##'
BEGIN
    SET @temp = STUFF(@message,1,2,'');
    SET @i = CHARINDEX('##',@temp);
    IF (@i>0)
    BEGIN
        set @searchTag= SUBSTRING(@temp,1,@i-1);
        set @message=STUFF(@temp,1,@i+1,'')
    END
END
SELECT @searchTag, @message

以防万一,如果格式不正确,我需要 select 空消息和原始消息

您当然可以删除 @temp 变量:

declare
    @message varchar(255)='##cloud##this is a cloud related message',
    @i int,
    @searchTag varchar(255)

if @message like '##%##%'
begin
    set @message = stuff(@message, 1, 2, '')
    set @i = charindex('##', @message)

    select
        @searchTag = left(@message, @i - 1),
        @message = stuff(@message, 1, @i + 1, '')
end

select @searchTag, @message

但从逻辑上讲,SQL 服务器必须传递字符串两次 - 检查是否有 2 次出现 ##,然后在解析时再传递一次。

另一种方法是使用 @searchTag 而不是 @temp 变量:

declare
    @message varchar(255)='##cloud##this is a cloud related message',
    @i int,
    @searchTag varchar(255)

if left(@message, 2) = '##'
begin
    set @searchTag = stuff(@message, 1, 2, '')
    set @i = charindex('##', @searchTag)

    if @i <= 0
    begin
        set @searchTag = null
    end
    else
    begin
        set @message = stuff(@searchTag, 1, @i + 1, '')
        set @searchTag = left(@searchTag, @i - 1)
    end
end

select @searchTag, @message

update如果你真的想摆脱变量,第一个方法也可以这样重写:

declare
    @message varchar(255)='##cloud##this is a cloud related message',
    @searchTag varchar(255)

if @message like '##%##%'
begin
    set @message = stuff(@message, 1, 2, '')

    select
        @searchTag = left(@message, charindex('##', @message) - 1),
        @message = stuff(@message, 1, len(@searchTag) + 2, '')
end

select @searchTag, @message