Изменить запрос T-SQL на SAP HANA

Я буду рад, если кто-то сможет полностью преобразовать этот запрос T-SQL в SAP HANA.

То, что я пытаюсь сделать, это запрос автонумерации с префиксом PV плюс 6 номеров. например pv000001. У меня есть это в T-SQL, но у меня есть проблема полностью изменить его на SAP HANA;

DECLARE @NumRange integer;
SET @NumRange := 6;
SELECT 'PV' || replicate('0', @NumRange - LENGTH(MAX(ISNULL(Incnum, 0)))) || CAST(MAX(ISNULL(Incnum, 0)) + 1 AS varchar(6)) 
FROM (
   SELECT MAX(coalesce(substring(CounterRef, 3, LENGTH(ISNULL(CounterRef, 0))), 0)) AS "incnum" 
   FROM OVPM T0 
   UNION ALL 
   SELECT MAX(coalesce(substring(CounterRef, 3, LENGTH(ISNULL(CounterRef, 0))), 0)) AS "incnum" 
   FROM OPDF T0 WHERE t0.ObjType = '46'
) AS Tb1;

person Justice Doku    schedule 26.09.2016    source источник
comment
отредактируйте свой вопрос и добавьте несколько примеров данных и ожидаемый результат на основе этих данных. Отформатируйте текст, пожалуйста, нет снимков экрана   -  person a_horse_with_no_name    schedule 26.09.2016
comment
Разве вы не можете просто использовать row_number() для генерации чисел?   -  person a_horse_with_no_name    schedule 26.09.2016


Ответы (2)


Это запрос, преобразованный в HANA SQLScript и немного измененный, чтобы заставить его работать в моей базе данных SAP Business One:

DO BEGIN
    DECLARE NumRange INTEGER;
    NumRange := 6;

    SELECT 'PV' || REPLICATE('0', :NumRange - LENGTH(MAX(IFNULL("Incnum", 0)))) || CAST(MAX(IFNULL("Incnum", 0)) + 1 AS VARCHAR(6))
    FROM (
        SELECT MAX(coalesce(substring("CounterRef", 3, LENGTH(IFNULL("CounterRef", 0))), 0)) AS "Incnum"
        FROM OVPM T0
        UNION ALL
        SELECT MAX(coalesce(substring("CounterRef", 3, LENGTH(IFNULL("CounterRef", 0))), 0)) AS "Incnum"
        FROM OPDF T0
        WHERE t0."ObjType" = '46'
    ) AS Tb1;
END;

В HANA нет функции REPLICATE, но вы можете создать свою собственную:

CREATE FUNCTION REPLICATE(input NVARCHAR(1000), count INT)
RETURNS output NVARCHAR(1000)
LANGUAGE SQLSCRIPT AS
BEGIN
    DECLARE i INT = 1;
    output := '';
    FOR i IN 1 .. count DO
        output := output || input;
    END FOR;
END;

Некоторые пояснения:

  • HANA разрешает SQL-скрипт (DECLARE, FOR и т. д.) только внутри блоков, поэтому я завернул первый оператор в анонимный DO BEGIN END блок.

  • HANA чувствительна к регистру, поэтому мне пришлось изменить регистр Incnum/incnum.

  • Вы записываете переменные, просто используя их имена, вы читаете их, добавляя перед ними двоеточие (:).

person djk    schedule 26.09.2016
comment
После создания функции и выполнения запроса я получаю следующую ошибку: - person Justice Doku; 27.09.2016
comment
@JusticeDoku Вы не добавили ошибку ниже. У меня запрос работает на свежей базе данных компании на SAP Business One 9.2 PL04. - person djk; 28.09.2016
comment
Привет, Ханнобо, я попытался вставить сюда ошибку, но мне было предложено, чтобы мои значения превышали 290 сообщений. Но я буду рад, если вы поделитесь со мной снимком экрана о том, как вы применяли запросы в версии SAP Business One для HANA 9.2 PL 04. Нужно ли мне запускать функцию в студии HANA и применять вышеуказанный запрос в SAP Business One? Пользовательское поле?? - person Justice Doku; 29.09.2016

просто краткое примечание о функции REPLICATE в HANA

У нас нет функции репликации SQLScript, но во многих случаях можно использовать строковую функцию LPAD.

Например, если в SQL Server T-SQL у нас есть:

select REPLICATE('0',4) 

В базе данных SAP HANA в SQLScript мы можем получить тот же результат следующим образом:

select LPAD('',4,'0') as str from DUMMY;

Конечно, если реплицируемая строка состоит из более чем одного символа, результаты вывода будут отличаться.

person Eralper    schedule 26.01.2017