2015-09-22 4 views
-3

Я работаю с столбцом FullName, который хранит длительное значение. Формат что-то вродеРазделение столбца на несколько столбцов в SQL Server

'Microsoft.SQL.Server.20XX.DBFile:ABC.edf.com;XXXX_XXX_XXX;master;1;1' 
'SQLVersion.DBFile:Hostname;InstanceName;Dummy;Dummy;Dummy' 

То, что я хочу, чтобы разбить FullName в SQLVersion, Hostname и InstanceName.

Я искал вид потоков о делении значений, разделяемых точкой или двоеточием, что немного отличается от моего случая.

+0

Сохранение значений в отдельных полях позволяет избежать проблемы. Если у вас есть таблица, подумайте об этом, вместо того, чтобы хранить несколько значений в одном столбце. – dasblinkenlight

+0

Я не владею таблицей, и я не могу изменить схему исходной таблицы. В любом случае, я решил с ответом Гиорги, спасибо. – kata0601

ответ

1

Вы можете использовать следующий трюк с cross apply. Я думаю, что код является самоочевидным и не нуждается в разработке:

create table t(v varchar(200)) 
insert into t values 
('Microsoft.SQL.Server.20XX.DBFile:ABC.edf.com;XXXX_XXX_XXX;master;1;1'), 
('SQLVersion.DBFile:Hostname;InstanceName;Dummy;Dummy;Dummy') 


select substring(v, 1, c1.i1 - 1) as SqlVersion, 
     substring(v, c1.i1 + 1, c2.i2 - c1.i1 - 1) as HostName, 
     substring(v, c2.i2 + 1, c3.i3 - c2.i2 - 1) as InstanceName 
from t 
cross apply(select charindex(':', t.v) as i1) c1 
cross apply(select charindex(';', t.v, c1.i1 + 1) as i2) c2 
cross apply(select charindex(';', t.v, c2.i2 + 1) as i3) c3 

В случае, если это непонятно. В первом крестике я выбираю индекс символа :. Во втором крестинге я выбираю индекс символа ;, который следует после применения индекса первого креста. В третьем случае применяется индекс символа ;, который после индекса второго креста. В основном выборе я просто использую эти индексы для захвата необходимых частей строки.

Fiddle здесь http://sqlfiddle.com/#!3/d79b45/16

+0

решил с вашим ответом, спасибо большое :) – kata0601

0

Я согласен с вышеприведенным комментарием, что, если это возможно, предпочтительнее использовать отдельные столбцы. Тем не менее, я считаю, что это синтаксический логика делает то, что вы хотите:

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 
Смежные вопросы