【问题标题】:Dynamic SQL Syntax Error SQLScript SAP HANA动态 SQL 语法错误 SQLScript SAP HANA
【发布时间】:2018-11-01 16:09:11
【问题描述】:

我在存储过程中有动态 SQL。

该过程采用三个参数:

  • DimPartialName
  • 列名
  • 上传 ID

程序如下:

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 语法错误:“Schema”。“DeletefromDIM”:第 15 行 col 1(位置 520):[257](范围 3)sql 语法错误异常:sql 语法错误:不正确“-”附近的语法:第 3 行第 41 行(在 pos 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'; 

这个错误并没有真正的意义,因为该位置不仅没有“-”,而且整个语句中也没有破折号。

【问题讨论】:

  • 将其更改为Varchar(max),在尝试评估字符串unique identifier 数据时出错,打印@sql 以检查脚本是否正确总是个好主意。简而言之,您的脚本没有用单引号将变量值括起来。

标签: sql syntax-error dynamic-sql hana hana-sql-script


【解决方案1】:

您应该检查生成的 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" = ZZ 周围缺少单引号。

将语句更改为

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;

应该解决问题。

【讨论】:

  • 谢谢,我没有意识到我可以打印动态 SQL。我发现 SQL 很难调试的部分原因是因为我没有可以打印到的控制台,但我想应该有。
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2021-06-03
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多