Все строковые операции (такие как ||-конкатенация) ограничены максимальным ограничением размера VarChar
(что составляет 32 КБ, что меньше 8200 букв в тексте в кодировке UTF-8).
Однако, похоже, есть BLOB
-ориентированные функции. Также не нужно экранировать значения NULL
с помощью COALESCE
.
СПИСОК возвращает строку, состоящую из значений аргументов, отличных от NULL, в группе, разделенных либо запятой, либо заданным пользователем разделителем.
https://firebirdsql.org/refdocs/langrefupd21-aggrfunc-list.html
Следовательно, используя derived tables
:
Select LIST(ALL X, '') From
( Select fieldTarget as x From tablename Where tablePk = :pkTarget
UNION ALL
Select Cast( :string AS VarChar(8191) ) From RDB$DATABASE )
As TMP
Приведение типов заключается в присвоении типа данных выражению, состоящему только из параметров.
P.S. в документации также утверждается, что
Порядок значений в списке не определен.
П.П.С. Готовый к запуску пример, проверенный на FB 2.1.7
Select LIST(ALL X, '') From
( Select Cast( :str_pre AS VarChar(8191) ) as X From RDB$DATABASE
UNION ALL
Select /* DATA column */ RDB$TRIGGER_SOURCE
From /* DATA table */ RDB$TRIGGERS
Where /* PK ID */ RDB$TRIGGER_NAME = :pkTarget
UNION ALL
Select Cast( :str_post AS VarChar(8191) ) From RDB$DATABASE
)
Передача таких имен, как RDB$TRIGGER_1
, даст вам system trigger
, который не имеет исходного текста, поэтому имеет значение NULL
в поле. Легко проверить, что здесь не нужен COALESCE
-скрининг :-D
person
Arioch 'The
schedule
07.03.2019
fieldTarget
? Что случается? Вы получаете ошибку? Какой язык и драйвер вы используете? Может быть, проблема в том, что:string
тоже печатается как большой двоичный объект, и ваш драйвер не обрабатывает это должным образом? - person Mark Rotteveel   schedule 07.03.2019