Die SQL-Dialekt von SAP HANA bietet leider keine „Split“-Funktion, um Zeichenfolgen anhand eines bestimmten Trennzeichens aufzulösen und weiter zu verarbeiten. Seit dem SPS07 gibt es das Repository Element hdbtablefunctions mit welchem das Feature einer SAP HANA Split Function komfortable umgesetzt werden kann.
Wie legt man eine eigene SAP HANA Split Function mit SQLScript in SAP HANA an?
Dazu müssen Sie im SAP HANA Studio eine Datei mit der Endung .hdbtablefunction anlegen und folgendes Coding einfügen. Die Funktion bietet die Möglichkeit einen String und ein Trennzeichen als Parameter zu übergeben. Als Rückgabe wird eine Tabelle mit einem Counter und dem dazugehörigen gesplitteten String ausgegeben.
FUNCTION "SYSTEM"."folder::fn_split_string" ( IP_STRING NVARCHAR(5000), IP_DELIMITER VARCHAR(1) )
RETURNS TABLE (ID INTEGER, VAL NVARCHAR(1000))
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER AS
v_out VARCHAR(100):='';
v_count INTEGER:=1;
v_substr VARCHAR(1000):='';
v_substr2 VARCHAR(1000):='';
id INTEGER array;
val VARCHAR(100) array;
BEGIN
v_substr:=:ip_string;
while(LOCATE (:v_substr, :ip_delimiter) > 0 ) do
-- find value
v_out := SUBSTR(v_substr, 0, LOCATE (:v_substr, :ip_delimiter) - 1 );
-- out to output
id[v_count]:=v_count;
val[v_count]:=v_out;
-- increment counter
v_count:=:v_count+1;
-- new substring for search
v_substr2 := SUBSTR(:v_substr, LOCATE (:v_substr, :ip_delimiter) + 1, LENGTH(:v_substr));
v_substr := v_substr2;
END while;
IF(LOCATE (:v_substr, :ip_delimiter) = 0 AND LENGTH(:v_substr) > 0) THEN
-- no delimiter in string
id[v_count]:=v_count;
val[v_count]:=v_substr;
END IF;
-- format output as tables
rst = unnest(:ID,:VAL) AS ("ID","VAL");
RETURN SELECT * FROM :rst;
END;
Wie wird die SQL Split Function nun in SAP HANA aufgerufen?
Die Funktion ist dann folgendermaßen über SQL nutzbar. Beispielsweise können so Input Parameter einer Calculation View, die zuerst gesplittet werden müsse, bequem verarbeitet werden.
-- Standard-Aufruf
select distinct id, val from "folder::fn_split_string"('test1;test2;test3;', ';');
-- Möglicher Verarbeitung in einem Calculation View
var_out = select * from "TABLE" where "ATTRIBUTE" IN (
select distinct val from "folder:fn_split_string"( :ip_param, ';') );
Mit SQLScript lässt sich in SAP HANA sehr gut Business Logik performant umsetzen. Ein weiteres Beispiel haben wir im Beitrag zur SAP HANA Passwort-Generierung dargestellt.
Benötigen Sie Beratungs- oder Entwicklungsunterstützung in Ihrem SAP BW / HANA / SAPUI5 Projekt? Dann zögern Sie nicht und kontaktieren uns unverbindlich unter info@intellify.de.
