2017-02-12 89 views
1

我有场这样从SQL Server多值字段获得列名和值


D1=1.05,D2=1.05,D3=0.84,L1=1.12,L2=1.12,L3=1.12,L12=0.6,L22=0.6,L32=0.4800,I1=0.5,I2=0.5,I3=0.38,A=90,OF=-1 

我怎么可能做出像这样


D1 D2 D3 L1 L2 L3 L12 L22 L32 I1 I2 I3 A OF 
1.05 1.05 0.84 1.12 1.12 1.12 0.6 0.6 0.48 0.5 0.5 0.38 90 -1 

+0

拆分它在应用程序代码,并插入到数据库中。 – GurV

回答

2

如果它是一个值,你可以试试这样的:

DECLARE @s VARCHAR(max)='D1=1.05,D2=1.05,D3=0.84,L1=1.12,L2=1.12,L3=1.12,L12=0.6,L22=0.6,L32=0.4800,I1=0.5,I2=0.5,I3=0.38,A=90,OF=-1' 
SET @s='select ['+REPLACE(REPLACE(@s,'=',']='),',',',[') 
PRINT @s 
EXEC(@s) 
 
D1 D2 D3 L1 L2 L3 L12 L22 L32 I1 I2 I3 A OF 
1.05 1.05 0.84 1.12 1.12 1.12 0.6 0.6 0.4800 0.5 0.5 0.38 90 -1 

采用分体式串和PIVOT

CREATE TABLE #tt(col varchar(max)) 
INSERT INTO #tt(col)VALUES('D1=1.05,D2=1.05,D3=0.84,L1=1.12,L2=1.12,L3=1.12,L12=0.6,L22=0.6,L32=0.4800,I1=0.5,I2=0.5,I3=0.38,A=90,OF=-1') 

DECLARE @col VARCHAR(max),@sql VARCHAR(max) 
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
SELECT y.* INTO #t FROM #tt AS t 
CROSS APPLY(VALUES(CONVERT(XML,'<n><t>'+REPLACE(REPLACE(t.col,'=','</t><v>'),',','</v></n><n><t>')+'</v></n>'))) x(xcol) 
CROSS APPLY(SELECT x.n.value('t[1]','varchar(200)') AS title, x.n.value('v[1]','varchar(200)') AS val FROM x.xcol.nodes('n') x(n)) y 

SELECT @col=ISNULL(@col+',','')+QUOTENAME(title) FROM #t GROUP BY title 
SET @sql='select * from #t pivot(max(val) for title in ('[email protected]+')) p' 
PRINT @sql 
EXEC(@sql) 

处理多个行: 正如下面的样本数据,有两个新的列(B和D4)在第2行

结果的列列表将所有数据行的所有列组合在一起。 它是否符合您的要求?

CREATE TABLE #tt(ID INT,col varchar(max)) 
INSERT INTO #tt(ID,col)VALUES(1,'D1=1.05,D2=1.05,D3=0.84,L1=1.12,L2=1.12,L3=1.12,L12=0.6,L22=0.6,L32=0.4800,I1=0.5,I2=0.5,I3=0.38,A=90,OF=-1') 
          ,(2,'D1=1.06,D2=1.06,D3=0.84,D4=1.84,L1=1.12,L2=1.12,L3=2.12,L12=0.6,L22=0.6,L32=0.5800,I1=0.5,I2=0.5,I3=1.38,A=90,B=99,OF=-1') 


DECLARE @col VARCHAR(max),@sql VARCHAR(max) 
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
SELECT ID, y.* INTO #t FROM #tt AS t 
CROSS APPLY(VALUES(CONVERT(XML,'<n><t>'+REPLACE(REPLACE(t.col,'=','</t><v>'),',','</v></n><n><t>')+'</v></n>'))) x(xcol) 
CROSS APPLY(SELECT x.n.value('t[1]','varchar(200)') AS title, x.n.value('v[1]','varchar(200)') AS val FROM x.xcol.nodes('n') x(n)) y 

SELECT @col=ISNULL(@col+',','')+QUOTENAME(title) FROM #t GROUP BY title 
SET @sql='select * from #t pivot(max(val) for title in ('[email protected]+')) p' 
PRINT @sql 
EXEC(@sql) 
 
ID A B D1 D2 D3 D4 I1 I2 I3 L1 L12 L2 L22 L3 L32 OF 
1 90 NULL 1.05 1.05 0.84 NULL 0.5 0.5 0.38 1.12 0.6 1.12 0.6 1.12 0.4800 -1 
2 90 99 1.06 1.06 0.84 1.84 0.5 0.5 1.38 1.12 0.6 1.12 0.6 2.12 0.5800 -1 
+0

Tnx为您的答复,但我有一个表中的列,它的价值就像我张贴在我的问题我如何分割该列值? –

+0

@mohammadabbasi在我的答案中的语句是“使用拆分字符串和PIVOT”从列中拆分值。它只是显示了一行,是否可能存在与您粘贴的其他数据具有不同的值对? –

+0

是的。但我想创建一个存储过程来过滤表(基于过滤器该列有一对值格式) –