Sql server分离字符串并透视结果

Sql server分离字符串并透视结果,sql,sql-server,tsql,split,pivot,Sql,Sql Server,Tsql,Split,Pivot,我有一个从查询中获取的字符串,用分隔符分隔: 之后,我需要将其放入列而不是行中,这就是我在搜索示例时所做的 Declare @NomeAux varchar(255) Declare @id int = 3059 select @NomeAux = des_auxiliar from WKF_ProcessoItem where Id_ProcessoItem = @id SELECT @id as id,Split.a.value('.', 'NVARCHAR(MAX)') va

我有一个从查询中获取的字符串,用分隔符分隔:

之后,我需要将其放入列而不是行中,这就是我在搜索示例时所做的

Declare @NomeAux varchar(255)
Declare @id int = 3059
select @NomeAux =  des_auxiliar from WKF_ProcessoItem  where Id_ProcessoItem = @id 

 SELECT   @id as id,Split.a.value('.', 'NVARCHAR(MAX)') valores
 into #temp
FROM
(   
    SELECT CAST('<X>'+REPLACE(@NomeAux, ';', '</X><X>')+'</X>' AS XML) AS String
) AS A
CROSS APPLY String.nodes('/X') AS Split(a);

SELECT 
    Id
,   [GSE]
,   [LOCAL]
,   [SN]
,   [Modelo]
,   [Fechadura]
,   [Vazio]
FROM #temp
PIVOT (
    max(valores)
    FOR valores IN ([GSE], [LOCAL], [SN],[Modelo],[Fechadura],[Vazio])
) AS PIVOTED
但我得到的所有值都是空的,如下所示:

我得到的所有值都为空

我需要的结果


这看起来是一种非常奇怪的存储EAV列表实体属性值的方法,其中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;
简而言之:

这种技术被称为条件聚合,是一种老式的枢轴。 我们使用XML在:-字符处分割文本,那么[GSE]SAO呢?。
我们返回一个分组集,其中包含有条件获取的值。

我看不出需要根据结果拆分什么。只需按原样透视表,看看您得到了什么。这是哪个版本的SQL Server?
id  GSE     NomeDoLocal SN      Modelo  Fechadura
1   [GSE] SAO    CASH   1111     blah1   11
2   [GSE] SAO    CREDIT 2222     blah2   22