Я согласен с вышеприведенным комментарием, что, если это возможно, предпочтительнее использовать отдельные столбцы. Тем не менее, я считаю, что это синтаксический логика делает то, что вы хотите:
declare
@test nvarchar(200)
, @versionStart int
, @versionLength int
, @hostStart int
, @hostLength int
, @instanceStart int
, @instanceLength int
SET @test = 'Microsoft.SQL.Server.20XX.DBFile:ABC.edf.com;XXXX_XXX_XXX;master;1;1'
SET @versionStart = PATINDEX('%Microsoft.SQL.Server.%', @test) + 21
SET @versionLength = CHARINDEX('.', @test, @versionStart) - @versionStart
SET @hostStart = PATINDEX('%.DBFile:%', @test) + 8
SET @hostLength = CHARINDEX(';', @test, @hostStart) - @hostStart
SET @instanceStart = CHARINDEX(';', @test, @hostStart + @hostLength) + 1
SET @instanceLength = CHARINDEX(';', @test, @instanceStart) - @instanceStart
select
SUBSTRING(@test, @versionStart, 4) AS Version
, SUBSTRING(@test, @hostStart, @hostLength) AS HostName
, SUBSTRING(@test, @instanceStart, @instanceLength) AS InstanceName
Сохранение значений в отдельных полях позволяет избежать проблемы. Если у вас есть таблица, подумайте об этом, вместо того, чтобы хранить несколько значений в одном столбце. – dasblinkenlight
Я не владею таблицей, и я не могу изменить схему исходной таблицы. В любом случае, я решил с ответом Гиорги, спасибо. – kata0601