#sql #db2
#sql #db2
Вопрос:
В связи с репликацией данных из SQL Server
в DB2
у меня следующий вопрос:
У DB2
меня есть таблица, содержащая (для простоты) два столбца: COL1
и COL2
.
COL1
определяется как CHAR(20)
. COL2
определяется как CHAR(10)
.
COL1
реплицируется из SQL путем преобразования строки в шестнадцатеричное значение, например "abcdefghij"
, в "6162636465666768696A"
или "1111111111"
в "31313131313131313131"
с помощью следующего SQL-запроса:
CONVERT(char(20), cast(@InputString as binary) 2)
где @InputString
бы это было "abedefghij"
.
Другими словами, COL1 содержит шестнадцатеричное значение, но в виде строки (извините, если формулировка неверна).
Мне нужно преобразовать шестнадцатеричное значение обратно в строку и поместить это значение COL2
в.
Какой SQL-запрос должен быть включен DB2
для выполнения преобразования? Я знаю, как это сделать SQL Server
, но не на DB2
.
Примечание: Причина, по которой шестнадцатеричное значение не фиксируется заранее "0x"
, заключается в том, что в инструкции используется стиль 2 CONVERT
.
Комментарии:
1. Вроде как решил мою проблему. Оказывается, что столбец, определенный как ДВОИЧНЫЙ на SQL Server, будет правильно реплицирован в столбец, определенный как VARCHAR для BIT в DB2. Все равно хотелось бы узнать ответ на вышесказанное, если у кого-нибудь он должен быть.
Ответ №1:
select hex('A') from sysibm.sysdummy1;
возвращает 41.
и
select x'41' from sysibm.sysdummy1;
дает вам ‘A’. Таким образом, вы можете поместить это в for
цикл и перебирать каждую пару шестнадцатеричных символов, чтобы получить исходную строку. Или вы можете написать свою собственную функцию unhex.
Взято из dbforums.com /db2/1627076-display-hex-columns.html (редактирование ноябрь 2020: ссылка на исходный источник теперь является спам-сайтом)
Ответ №2:
DB2 имеет встроенное кодирование / декодирование.
Для вопроса OPs используйте….
select CAST(ColumnName as char(20) CCSID 37) as ColumnName from TableName where SomeConditionExists
Комментарии:
1. Спасибо!! Жаль, что я не могу дать вам больше одного голоса: D
2. SQL0622N Предложение «CCSID <целое число>» недопустимо для этой базы данных. SQLSTATE=56031
Ответ №3:
Это одна из наиболее близких тем к предмету моей проблемы:
Я потерял 2 дня, чтобы выяснить, как перенести XML-файлы, хранящиеся в DB2 BLOB-поле, с помощью SQL Developer. (Да, миграция и выполнение запросов от SQL Developer — мы переносим данные в Oracle из DB2, поэтому мы использовали этот инструмент)!
Как отобразить XML-файл / строку, хранящуюся в BLOB?
Давайте начнем с того, в чем заключалась проблема:
- Данные в большом двоичном объекте представляли собой XML-файл.
-
При выборе в запросе, получил:
-
При приведении, например:
select CAST(BLOBCOLUMN as VARCHAR(1000)) from TABLE where id = 100;
вывод был в шестнадцатеричном формате:
- Ничего не сработало… Даже не решение из ссылок в этом разделе. !НИЧЕГО!
По ошибке найдено решение:
-
СОЗДАНИЕ ФУНКЦИИ в DB2:
CREATE FUNCTION unhex(in VARCHAR(32000) FOR BIT DATA)
RETURNS VARCHAR(32000)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC NO EXTERNAL ACTION
BEGIN ATOMIC
RETURN in;
END -
Запустите SELECT:
select UNHEX( CAST(BLOBCOLUMN as VARCHAR(32000) FOR BIT DATA)) from TABLE where id = 100;
-
Результат:
Ответ №4:
Я использую это для преобразования БИТОВЫХ ДАННЫХ в символы:
cast (colvalue as varchar(2000) ccsid ebcdic for sbcs data)