Синтаксическая ошибка динамического SQL SQLScript SAP HANA - PullRequest
0 голосов
/ 01 ноября 2018

У меня динамический SQL в хранимой процедуре.

Процедура принимает три параметра:

  • DimPartialName
  • ColumnName
  • UploadID

Вот процедура:

PROCEDURE "Schema"."DeletefromDIM" (In DimPartialName NVARCHAR(50), In 
IDColumnName NVARCHAR(50), IN UploadID NVARCHAR(36) ) 
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER 
--DEFAULT SCHEMA <default_schema_name>
AS
BEGIN
EXECUTE IMMEDIATE
'select distinct "'|| IDColumnName ||'" from 
"Schema"."ZT.'|| DimPartialName ||'" dim
LEFT JOIN "Schema"."SourceTable" raw on 
dim."AUDIT.CREATED_ON" = raw."Audit.CREATED_ON"
where "UPLOAD_UUID" = ' || UploadID ||' ';
End;

и ошибка:

SAP DBTech JDBC: [257]: синтаксическая ошибка sql: «Схема». «DeletefromDIM»: строка 15 столбец 1 (в позиции 520): [257] (диапазон 3) исключение синтаксической ошибки sql: синтаксическая ошибка sql: неверно синтаксис рядом с «-»: строка 3 кол 41 (в позиции 214)

когда я запускаю этот SQL в консоли и подставляю во входные данные, он работает нормально:

select distinct "BRANDID" from "Schema"."ZT.BRAND" dim
LEFT JOIN "Schema"."SourceTable" raw on dim."AUDIT.CREATED_ON" = raw."Audit.CREATED_ON"
where "UPLOAD_UUID" = 'f889e016-1364-4aac-9536-037d932c55b5'; 

Ошибка на самом деле не имеет смысла, потому что не только нет «-» в этой позиции, но и нет черты во всем утверждении.

1 Ответ

0 голосов
/ 02 ноября 2018

Вы должны проверить сгенерированную строку SQL, выбрав ее для вывода, например так:

BEGIN

        select                'select distinct "'|| IDColumnName ||'" from 
                        "Schema"."ZT.'|| DimPartialName ||'" dim
                        LEFT JOIN "Schema"."SourceTable" raw on 
                        dim."AUDIT.CREATED_ON" = raw."Audit.CREATED_ON"
                        where "UPLOAD_UUID" = ' || UploadID ||' ' as SQLTEXT from dummy;

End;

Если вы сделаете это, вы обнаружите, что сгенерированный оператор SQL выглядит следующим образом (для ввода 'X', 'Y', 'Z'):

select distinct "Y" from 
                    "Schema"."ZT.X" dim
                    LEFT JOIN "Schema"."SourceTable" raw on 
                    dim."AUDIT.CREATED_ON" = raw."Audit.CREATED_ON"
                    where "UPLOAD_UUID" = Z 

Обратите внимание, что условие WHERE "UPLOAD_UUID" = Z не имеет одинарных кавычек вокруг Z.

Изменение выражения на

BEGIN

    execute immediate 
                  'select distinct "'|| :IDColumnName ||'" ' 
               || 'from '
               || '"Schema"."ZT.'|| :DimPartialName ||'" dim '
               || 'LEFT JOIN "Schema"."SourceTable" raw on '
               || 'dim."AUDIT.CREATED_ON" = raw."Audit.CREATED_ON" '
               || 'where "UPLOAD_UUID" = ''' || :UploadID ||''' ';

END;

должен исправить проблему.

...