Преобразование SMALLINT в VARCHAR в операторе SELECT / CASE в запросе SQL - PullRequest
0 голосов
/ 26 декабря 2018

Я работаю над кодом, который принимает десятичный вывод и преобразует его в сокращенный шестнадцатеричный вывод.Тем не менее, я получаю сообщение об ошибке при попытке преобразовать формат smallint в varchar.Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке

Сообщение 245, Уровень 16, Состояние 1, Строка 1
Ошибка преобразования при преобразовании значения varchar 'E' в тип данных smallint

Я попытался преобразовать оператор SELECT в:

SELECT 
    *, 
    CONVERT(VARCHAR, PCM_ID1)

Но это возвращает то же сообщение об ошибке.Я также изменил код на

...
WHEN PCM_ID1 = '10' THEN CAST('A' AS VARCHAR)
WHEN PCM_ID1 = '11' THEN CAST('B' AS VARCHAR)
WHEN PCM_ID1 = '12' THEN CAST('C' AS VARCHAR)
WHEN PCM_ID1 = '13' THEN CAST('D' AS VARCHAR)
WHEN PCM_ID1 = '14' THEN CAST('E' AS VARCHAR)
WHEN PCM_ID1 = '15' THEN CAST('F' AS VARCHAR)
...

, и это также возвращает то же сообщение об ошибке.Исходный пример кода приведен ниже:

SELECT 
    *, 
FROM
    dbo.DMV_All_Tests
CROSS APPLY 
    (SELECT
         CASE
            WHEN PCM_ID1 = '0' THEN '0'
            WHEN PCM_ID1 = '1' THEN '1'
            WHEN PCM_ID1 = '2' THEN '2'
            WHEN PCM_ID1 = '3' THEN '3'
            WHEN PCM_ID1 = '4' THEN '4'
            WHEN PCM_ID1 = '5' THEN '5'
            WHEN PCM_ID1 = '6' THEN '6'
            WHEN PCM_ID1 = '7' THEN '7'
            WHEN PCM_ID1 = '8' THEN '8'
            WHEN PCM_ID1 = '9' THEN '9'
            WHEN PCM_ID1 = '10' THEN 'A'
            WHEN PCM_ID1 = '11' THEN 'B' 
            WHEN PCM_ID1 = '12' THEN 'C'
            WHEN PCM_ID1 = '13' THEN 'D'
            WHEN PCM_ID1 = '14' THEN 'E'
            WHEN PCM_ID1 = '15' THEN 'F'
            WHEN PCM_ID1 = '16' THEN '10'
            ELSE PCM_ID1
         END AS [PCM ID1 Dec2Hex]) ca
WHERE
    KeyDateTime BETWEEN '2018/11/01' AND '2018/12/01' 
    AND ca.[PCM ID1 Dec2Hex] = '1'

Моя цель - завершить успешное преобразование, чтобы вместо «14», поскольку PCM_ID1 сохранялся в базе данных, он дал бы мне шестнадцатеричный эквивалент, либо«F» или «0F».Это будет использоваться для перекрестной проверки с нашей другой базой данных, которая хранит эти значения PCM_ID1 в шестнадцатеричном виде.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018
declare @input as smallint = 1;
select format(@input, 'X');
0 голосов
/ 26 декабря 2018

Итак, я воссоздал вашу ошибку:

DECLARE @X TABLE (PCM_ID1 smallint)

INSERT INTO @X SELECT 14
INSERT INTO @X SELECT 1

    SELECT
    CASE
        WHEN PCM_ID1 = '0' THEN '0'
        WHEN PCM_ID1 = '1' THEN '1'
        WHEN PCM_ID1 = '2' THEN '2'
        WHEN PCM_ID1 = '3' THEN '3'
        WHEN PCM_ID1 = '4' THEN '4'
        WHEN PCM_ID1 = '5' THEN '5'
        WHEN PCM_ID1 = '6' THEN '6'
        WHEN PCM_ID1 = '7' THEN '7'
        WHEN PCM_ID1 = '8' THEN '8'
        WHEN PCM_ID1 = '9' THEN '9'
        WHEN PCM_ID1 = '10' THEN 'A'
        WHEN PCM_ID1 = '11' THEN 'B' 
        WHEN PCM_ID1 = '12' THEN 'C'
        WHEN PCM_ID1 = '13' THEN 'D'
        WHEN PCM_ID1 = '14' THEN 'E'
        WHEN PCM_ID1 = '15' THEN 'F'
        WHEN PCM_ID1 = '16' THEN '10'
        ELSE PCM_ID1
    END AS [PCM ID1 Dec2Hex]
    FROM @X

Если вы, что вы получите ту же ошибку.Причина в том, что ELSE в вашем операторе case возвращает поле smallint, которое делает поле [PCM ID1 Dec2Hex] smallint, и вы получаете ошибку.

Если вы приведете else как varchar, это исправит эту проблему.Проблема в том, что он пытается преобразовать E обратно в smallint.Я надеюсь, что это имеет смысл.

DECLARE @X TABLE (PCM_ID1 smallint)

INSERT INTO @X SELECT 14
INSERT INTO @X SELECT 1

    SELECT
    CASE
        WHEN PCM_ID1 = '0' THEN '0'
        WHEN PCM_ID1 = '1' THEN '1'
        WHEN PCM_ID1 = '2' THEN '2'
        WHEN PCM_ID1 = '3' THEN '3'
        WHEN PCM_ID1 = '4' THEN '4'
        WHEN PCM_ID1 = '5' THEN '5'
        WHEN PCM_ID1 = '6' THEN '6'
        WHEN PCM_ID1 = '7' THEN '7'
        WHEN PCM_ID1 = '8' THEN '8'
        WHEN PCM_ID1 = '9' THEN '9'
        WHEN PCM_ID1 = '10' THEN 'A'
        WHEN PCM_ID1 = '11' THEN 'B' 
        WHEN PCM_ID1 = '12' THEN 'C'
        WHEN PCM_ID1 = '13' THEN 'D'
        WHEN PCM_ID1 = '14' THEN 'E'
        WHEN PCM_ID1 = '15' THEN 'F'
        WHEN PCM_ID1 = '16' THEN '10'
        ELSE CAST(PCM_ID1 AS VARCHAR)
    END AS [PCM ID1 Dec2Hex]
    FROM @X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...