2014-12-30 2 views
1

У меня есть требование, когда мне нужно преобразовать все хранимые процедуры SQL Server в хранимые процедуры HANA. Я столкнулся с функцией ISNUMERIC в T-SQL, и я не получаю ее эквивалент в HANA.Что такое эквивалент функции T-SQL ISNUMERIC в HANA Sqlscript?

После поиска в Интернете я обнаружил, что HANA не имеет встроенной эквивалентной функции ISNUMERIC. Затем я попытался написать свою собственную функцию для достижения этой цели, и там я столкнулся с ошибками и ограничениями регулярного выражения.

Моя HANA версия 70.

ответ

3

SAP HANA не приходит с ISNUMERIC() функции. Однако этот вопрос был задан и несколько раз ответил на SCN: E.g. http://scn.sap.com/thread/3449615

или мой подход от спины в дни: http://scn.sap.com/thread/3638673

drop function isnumeric; 
create function isNumeric(IN checkString NVARCHAR(64)) 
returns isNumeric integer 
language SQLSCRIPT as 
begin 
declare tmp_string nvarchar(64) := :checkString; 
declare empty_string nvarchar(1) :=''; 

/* replace all numbers with the empty string */ 
tmp_string := replace (:tmp_string, '1', :empty_string); 
tmp_string := replace (:tmp_string, '2', :empty_string); 
tmp_string := replace (:tmp_string, '3', :empty_string); 
tmp_string := replace (:tmp_string, '4', :empty_string); 
tmp_string := replace (:tmp_string, '5', :empty_string); 
tmp_string := replace (:tmp_string, '6', :empty_string); 
tmp_string := replace (:tmp_string, '7', :empty_string); 
tmp_string := replace (:tmp_string, '8', :empty_string); 
tmp_string := replace (:tmp_string, '9', :empty_string); 
tmp_string := replace (:tmp_string, '0', :empty_string); 

/*if the remaining string is not empty, it must contain non-number characters */ 
if length(:tmp_string)>0 then 
    isNumeric := 0; 
else 
    isNumeric := 1; 
end if; 

end; 

Тестирование это показывает: с данными, как (выберите «1blablupp» как VAL от фиктивной союза всех выберите «1234», как VAL от фиктивная объединение всех выберите «bla123», как вал с соской)

select val, isNumeric(val) from data 

VAL   ISNUMERIC(VAL) 
1blablupp 0    
1234  1    
bla123  0 
+0

Это не является полным: насчет -100, 1.000.000 и т.д. –

0

Это решение должно охватывать действительно все строки, которые конвертируемая как номер:

PROCEDURE "SCHEMA"."package::IS_NUMERIC" ( 
     in stringToCheck nvarchar(5000) 
     ,out isNumeric integer 
) 
    LANGUAGE SQLSCRIPT 
    SQL SECURITY INVOKER 
    --DEFAULT SCHEMA <default_schema_name> 
    READS SQL DATA AS 
BEGIN 

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    isNumeric := 0; 
END; 

select cast(:stringToCheck as double) from dummy; 

isNumeric := 1; 

END; 

например также охватывает: call "SCHEMA"."package::IS_NUMERIC"('-12.345', ?)

+0

Вы правы, это очень старое решение не охватывает огромный диапазон случаев. Частично это было связано с ограничениями HANA еще в SP6/7. Очевидно, что ваш подход к фактическому выполнению успешной или неудачной конверсии и отчетности является правильным. –

+1

Однако часто требования могут быть более конкретными (т. Е. Также игнорируют запятые, полные остановки и символы валюты, такие как T-SQL). Кроме того, использование процедуры (почему процедура для одного скалярного значения?) Вводит довольно некоторые накладные расходы. В качестве альтернативы можно было бы использовать регулярное выражение для проверки достаточно близко: 'MAP (locate_regexpr (START '[^ 0-9 \ - \. \, \ + E]' FLAG 'i' в id_char), 0, 1, 0) '. Использование этого на 10 Mio-рядах заняло 8,5 секунды, а процедура/функция заняла 19,5 секунды в моей тестовой системе. Что лучше всего на самом деле зависит от варианта использования. –

+0

О, это интересно - thx для обмена! –

Смежные вопросы