вставить значение varbinary из шестнадцатеричного литерала в Microsoft SQL Server - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение SpringBoot, где я использую jdbcTemplate для вставки строки в mssql

int numOfRowsAffected = remoteJdbcTemplate.update("insert into dbo.[ELCOR Resource Time Registr_]  "
                + "( [Entry No_], [Record ID], [Posting Date], [Resource No_], [Job No_], [Work Type], [Quantity], [Unit of Measure], [Description], [Company Name], [Created Date-Time], [Status] ) "
                + " VALUES (?,CONVERT(varbinary,?),?,?,?,?,?,?,?,?,?,?);",

                ELCORResourceTimeRegistr.getEntryNo(), 
                ELCORResourceTimeRegistr.getEntryNo()), 
                ELCORResourceTimeRegistr.getPostingDate(),
                ELCORResourceTimeRegistr.getResourceNo(), 
                jobNo,
                ELCORResourceTimeRegistr.getWorkType(), 
                ELCORResourceTimeRegistr.getQuantity(),
                ELCORResourceTimeRegistr.getUnitOfMeasure(), 
                ELCORResourceTimeRegistr.getDescription(),
                ELCORResourceTimeRegistr.getCompanyName(), 
                ELCORResourceTimeRegistr.getCreatedDate(), 
                0);

значение ELCORResourceTimeRegistr.getEntryNo() - это строка со значением 0x00173672

но то, что вставлено в БД, это <30007800 30003000 31003700 33003600 37003200>

ELCORResourceTimeRegistr.getEntryNo().getClass().getCanonicalName() => java.lang.String

1 Ответ

0 голосов
/ 25 мая 2018

Документация для функции CONVERT говорит, что "стиль" по умолчанию для двоичных типов - 0:

Переводит символы ASCII в двоичные байты или двоичные байты вСимволы ASCII.Каждый символ или байт конвертируется 1: 1.

Итак,

SELECT CONVERT(VARBINARY, '0x00173672') AS foo;

возвращает

foo
--------------------------------------------------------------
0x30783030313733363732

, которые являются байтовыми значениями ASCII шестнадцатеричного литерала, а не сами шестнадцатеричные байты.Чтобы преобразовать интерпретировать шестнадцатеричный литерал, вам нужно использовать стиль 1, то есть

SELECT CONVERT(VARBINARY, '0x00173672', 1) AS foo;

, который возвращает

foo
--------------------------------------------------------------
0x00173672
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...