2016-08-16 16 views
-1

データコレクタはSQL Server 2008に時系列データを送信しました。データテーブルをより簡潔にするため、時系列はenvelop [] 。 は、これは、SQL Serverに格納されたデータであり、私の仕事は、上記での和(0,18,22,28、...)を取得し、例えば、すべての行の読み取り値列を合計することであるSQLサーバーのenvelope []データの処理方法

enter image description here

表。 {envelope:[{0,0]、...}のようなデータをSQL Serverに展開する関数がある場合は、パーサの助けを借りて

+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 

UDF

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

はあなたのアドバイスをありがとうございとして期待される結果と現在の結果を貼り付けてください。依然としていくつかの質問があります:1私のテーブルの読みのデータタイプは何ですか? xml?2私の問題やそのようなデータ(封筒:[{0:0}、{1:18}、{2:22}、{3:28}、}}を扱ういくつかの記事やブログを提供できますか?もう一度おねがいします – wikichung

+0

@ウィキン1)varchar(50)は何でもできるので、サンプルデータを定義しました2)XMLはUDFにあります。これは、文字列を解析する最も効率的な方法です。それは非常に強力で柔軟性があります。 –

関連する問題