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
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
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
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