在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
我需要解析传递给存储过程的消息。消息的格式可能类似于 ##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