2017-06-13 3 views
-1

Partage de ce code qui analyse les données HL7 brutes en utilisant uniquement la syntaxe MS SQL. C'est un moyen rapide de diviser tous les | et^délimite et stocke chaque donnée sous forme de ligne. Je voulais partager cela parce que j'ai cherché comment analyser le message HL7 strictement par le biais de la syntaxe SQL et je n'ai pas trouvé de ressources.Comment analyser les délimiteurs HL7 en utilisant seulement MS SQL Syntaxe

Je dirais que ce n'est pas la méthode la plus efficace pour importer des messages HL7 dans des bases de données SQL. Il existe d'autres méthodes (ie: C# app - HL7> XML> DB, logiciel tiers, BULK INSERT etc.).

Ceci est la syntaxe SQL qui va lire le | et^délimitez et stockez-les en rangées sous les tables TempSplit et TempSplit2. L'hypothèse ici est que vous avez un moyen d'importer le fichier brut HL7 dans une base de données (à savoir: SSIS). À partir de ce moment, vous pouvez mapper les résultats stockés sous TempSplit2 à votre table Segment SQL.

ID Colonne = position de chaque valeur entre |

colonne ID2 = position de chaque valeur entre^

Dans un premier test, vous pouvez importer le fichier RAW HL7 (comme) dans 2 colonnes. Voir exemple ci-dessous:

Row  val          Filename 
    ------------------------------------------------------------------ 
    1  MSH|^~\&|EIH7|      HL7_Filename.dat 
      AB-PBA^AB PBA^ISO|Company|TestComp| 
      20160830230713||ADT^A04|23071 
      408302016752373|P|2.6|  

EDIT: Comme mentionné par scsimon ci-dessous, le curseur deux fois et boucles parse toutes données, plutôt que ce que vous avez juste besoin. Dans mon projet actuel, c'était important mais peut-être pas sur le vôtre. Ne hésitez pas à le modifier

Voici le code:

USE <yourdb> 
Go 
set nocount on 


Create table dbo.TempSplit(
        filename varchar(MAX), 
        RecordType varchar(MAX), 
        value varchar(MAX) , 
        id int) 
Create table dbo.TempSplit2(
        filename varchar(MAX), 
        RecordType varchar(MAX), 
        value varchar(MAX) , 
        id int , 
        subvalue varchar(MAX) , 
        id2 int) 

truncate table dbo.TempSplit 
truncate table dbo.TempSplit2 
DECLARE HL7_Cursor CURSOR FOR select distinct filename 
from <your raw HL7 table> 
DECLARE @tempid varchar(max) 

Open HL7_Cursor 
Fetch next from hl7_cursor into @tempid 
While @@FETCH_STATUS = 0 
BEGIN 
Declare @Rowcnt int=0 
DECLARE HL7_Cursor2 CURSOR FOR select val from <<your raw HL7 table>> where filename = @tempid 
DECLARE @tempid2 varchar(max) 

Open HL7_Cursor2 
Fetch next from hl7_cursor2 into @tempid2 
While @@FETCH_STATUS = 0 
      BEGIN 
      set @Rowcnt = @Rowcnt +1 
      DECLARE @RtnValue table 
       (
        value varchar(MAX) , 
        id int 
       ) 

      DECLARE @result varchar(1000), 
        @List varchar(MAX), 
        @SplitOn varchar(5), 
        @GetIndex smallint, 
        @ID int, 
        @val varchar(max), 
        @recordid varchar(max), 
        @filename varchar(1000) , 

        @cnt int=0 
      SET @list = @tempid2 

      SET @SplitOn = '|' 
      SET @GetIndex = 0 

      DECLARE @start INT, @end INT 
      SELECT @start = 1, @end = CHARINDEX(@SplitOn, @list) 
      WHILE @start < LEN(@list) + 1 BEGIN 
       BEGIN 
       IF @end = 0 
       begin 
       SET @end = LEN(@list) + 1 
       end 
       END 

       Insert Into @RtnValue (id,value) 
       Select @cnt,SUBSTRING(@list, @start, @end - @start) 
       SET @start = @end + 1 
       SET @end = CHARINDEX(@SplitOn, @list, @start) 
       set @cnt= @cnt+1  
       END 

       insert into dbo.TempSplit 
       select @tempid filename, 
         case when 
         (Select count(value) 
         from @RtnValue) = 0 then value 
         else 
         (Select value 
         from @RtnValue 
         where id =0)end Recordtype, 
         value,id,@Rowcnt from @RtnValue 
         delete from @RtnValue 
         set @cnt =0 


FETCH NEXT From HL7_Cursor2 into @tempid2          
END      
Close hl7_cursor2 
deallocate hl7_cursor2 

FETCH NEXT From HL7_Cursor into @tempid          
END      
Close hl7_cursor 
deallocate hl7_cursor 

truncate table dbo.TempSplit2 
DECLARE HL7_Cursor3 CURSOR FOR select * from dbo.TempSplit 
DECLARE @file varchar(max),@rt varchar(max),@valu varchar(max),@idz int 
,@rowcnt2 int 

Open HL7_Cursor3 
Fetch next from hl7_cursor3 into @file,@rt,@valu,@idz,@rowcnt2 
While @@FETCH_STATUS = 0 
     BEGIN 
      DECLARE @RtnValue2 table 
       (

        value varchar(MAX) , 
        id int, 
        filename varchar(MAX) 
       ) 

      DECLARE @result2 varchar(1000), 
        @List2 varchar(MAX), 
        @SplitOn2 varchar(5), 
        @GetIndex2 smallint, 
        @ID2 int, 
        @val2 varchar(max), 
        @recordid2 varchar(max), 
        @filename2 varchar(1000) , 
        @cnt2 int=0 
      SET @list2 =  @valu 

      SET @SplitOn2 = '^' 
      SET @GetIndex2 = 0 

      DECLARE @start2 INT, @end2 INT     
      SELECT @start2 = 1, @end2 = CHARINDEX(@SplitOn2, @list2) 
      WHILE @start2 < LEN(@list2) + 1 BEGIN 
       BEGIN 
       IF @end2 = 0 
       begin 
       SET @end2 = LEN(@list2) + 1 
       end 
       END 
      Insert Into @RtnValue2 (id,value,filename) 
      Select @cnt2,SUBSTRING(@list2, @start2, @end2 - @start2) ,@file 
      SET @start2 = @end2 + 1 
      SET @end2 = CHARINDEX(@SplitOn2, @list2, @start2) 
      set @cnt2= @cnt2+1 
      END 
      insert into dbo.TempSplit2 
     select @file,@rt,@valu,@idz,value,id,@rowcnt2 from @RtnValue2 
     delete from @RtnValue2 
     set @cnt2 =0 

FETCH NEXT From HL7_Cursor3 into @file,@rt,@valu,@idz ,@rowcnt2         
End       
Close hl7_cursor3 
deallocate hl7_cursor3 
+1

Je ne vous ai pas DV, mais vous devriez vraiment regarder [l'un de ces répartiteurs] (http://www.sqlservercentral.com/articles/ Tally + Table/72993 /) puisque ce que vous avez ** aura certainement des performances terribles. ** Cela séparera votre chaîne de tout délimiteur. Dans ce cas, vous devez simplement séparer une [substring()] (https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql) de votre chaîne, puis sélectionnez les colonnes que vous voulez. Le seul curseur dont vous avez besoin est de faire une boucle dans chaque fichier séparé qui est votre curseur le plus externe. Le reste va disparaître – scsimon

+0

Vous pouvez aussi simplement [INSULER EN VRAC] (https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql) avec le délimiteur approprié et puis déposez ce dont vous n'avez pas besoin. – scsimon

+0

Merci pour votre commentaire @scsimon. Pour l'instant, cela fait mon travail (bien qu'il y ait un coup de performance). J'apprécie votre contribution, je vais regarder dans BULK INSERT et mes splitters – Isaiah3015

Répondre

0

Le code sur le poste doit analyser à travers les messages HL7 délimiteurs | et ^, si vous voulez analyser le ~ délimiteur, alors vous devrez ajouter un autre curseur pour cela.

est ici le résultat final de ce qu'il devrait ressembler à:

Row filename   RecordType Value id Subvalue id2 RecordTypeID         
------------------------------------------------------------------ 
1  HL7_filename.dat MSH  MSH  0 MSH  0  1 
2  HL7_filename.dat MSH  ^~\&  1   0  1 
3  HL7_filename.dat MSH  ^~\&  1 ^~\& 1  1 
4  HL7_filename.dat MSH  EIH7  2 EIH7 0  1 

A partir de là, vous pouvez mapper les données de subvalue basées sur la « RecordType », « id » et « ID2 » à vos tables correspondantes . Le compteur RecordTypeID est utilisé si le même segment a été envoyé plusieurs fois dans un fichier.

Espérons que ce sera une aide à certains qui sont coincés