您可以使用字符索引 http://msdn.microsoft.com/en-us/library/ms186323.aspx and 子串 http://msdn.microsoft.com/en-us/library/ms187748.aspx。例如,要搜索“baz”的值:
declare @str varchar(128)
set @str = 'foo=abc;bar=def;baz=ghi'
-- Make sure @str starts and ends with a ;
set @str = ';' + @str + ';'
select substring(@str,
charindex(';baz=',@str) + len(';baz='),
charindex('=',@str,charindex(';baz=',@str)) - charindex(';baz=',@str) - 1)
或者对于字符串开头的“foo”的值:
select substring(@str,
charindex(';foo=',@str) + len(';foo='),
charindex('=',@str,charindex(';foo=',@str)) - charindex(';foo=',@str) - 1)
这是一个实现此目的的 UDF(受 BlackTigerX 答案启发的更具可读性的版本):
create function dbo.FindValueInString(
@search varchar(256),
@name varchar(30))
returns varchar(30)
as
begin
declare @name_start int
declare @name_length int
declare @value_start int
declare @value_end int
set @search = ';' + @search
set @name_start = charindex(';' + @name + '=',@search)
if @name_start = 0
return NULL
set @name_length = len(';' + @name + '=')
set @value_start = @name_start + @name_length
set @value_end = charindex(';', @search, @value_start)
return substring(@search, @value_start, @value_end - @value_start)
end
正如您所看到的,这在 Sql Server 中并不容易:) 最好用客户端语言来完成此操作,或者规范化您的数据库,以便子字符串位于它们自己的列中。