Это выглядит как довольно странный способ хранения списка EAV (Entity-Attribute-Value), где id
обозначает объект, а текст - пара имя-значение . Попробуйте что-нибудь по этому поводу:
DECLARE @tbl TABLE(id INT,valores VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'[GSE] SAO')
,(1,'NOME DO LOCAL: CASH')
,(1,'SN:1111')
,(1,'MODELO: blah1')
,(1,'FECHADURA: 11')
,(2,'[GSE] SAO')
,(2,'NOME DO LOCAL: CREDIT')
,(2,'SN:2222')
,(2,'MODELO: blah2')
,(2,'FECHADURA: 22');
SELECT t.id
,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='[GSE] SAO' THEN t.valores END) AS GSE
,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='NOME DO LOCAL' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS NomeDoLocal
,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='SN' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS SN
,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='MODELO' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS Modelo
,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='FECHADURA' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS Fechadura
FROM @tbl t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.valores,':','</x><x>') + '</x>' AS XML)) A(valoresXML)
GROUP BY t.id;
Результат
id GSE NomeDoLocal SN Modelo Fechadura
1 [GSE] SAO CASH 1111 blah1 11
2 [GSE] SAO CREDIT 2222 blah2 22
Идея вкратце:
Этот метод называется "условной агрегацией" (вид старомодный pivot).
Мы используем XML для разделения текста на :
-характер (как насчет [GSE] SAO
?).
Мы возвращаем сгруппированный набор со значениями, взятыми условно .