2016-08-16 41 views
-1

數據收集器向sql server 2008發送時間序列數據。爲了使數據表更簡潔,時間序列以envelop []形式發送。 這是存儲在SQL Server中的數據如何處理SQL服務器中的envelope []數據

enter image description here

我的工作是總結每一行中讀物列,例如在上述得到的總和(0,18,22,28,...)表。如果在sql server中有任何函數展開數據,例如{envelope:[{0,0],...}

+2

請貼預期的結果和目前的結果作爲文本 – TheGameiswar

回答

0

隨着解析器的幫助UDF

Declare @YourTable table (Readings varchar(50)) 
Insert Into @YourTable values 
('{envelope:[{0:0},{1:18},{2:22},{3:28},]}'), 
('{envelope:[{0:0},{1:12},{2:17},{3:24},]}') 

Select A.* 
     ,B.Total 
From @YourTable A 
Cross Apply (Select Total = sum(cast(Substring(Key_Value,1,charindex('}',Key_Value)-1) as int)) from [dbo].[udf-Str-Parse](Readings,':') where ISNUMERIC(left(Key_Value,1))=1) B 

返回

Readings         Total 
{envelope:[{0:0},{1:18},{2:22},{3:28},]} 68 
{envelope:[{0:0},{1:12},{2:17},{3:24},]} 53 

如果需要

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max)) 
As 
Begin 
    Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
    Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String) 
    Return 
End 
+0

謝謝您的通知UDF。還有一些問題需要問:1我的表中讀數的數據類型是什麼? xml?2能否提供一些關於處理我的問題或數據的文章或博客{envelope:[{0:0},{1:18},{2:22},{3:28},}}。再次感謝 – wikichung

+0

@wikichung 1)我將樣本數據定義爲varchar(50)可以是任何東西2)XML在UDF中。這是解析字符串的最有效方式。這是非常強大和靈活的...相信我你會挖它。 –