SQL查询中的SELECT / CASE语句中的SMALLINT到VARCHAR转换

时间:2018-12-26 20:41:38

标签: sql sql-server type-conversion varchar

我正在处理一个接受十进制输出并将其更改为缩写十六进制输出的代码。但是,当我尝试将smallint格式转换为varchar时,出现错误消息。当我运行下面的代码时,我收到错误消息

  

第245级状态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'

我的目标是完成一次成功的转换,以便将PCM_ID1存储在数据库中而不是14,而是给我十六进制等效值,即F或0F。这将用于与我们的其他数据库进行交叉检查,该数据库将这些PCM_ID1值存储为十六进制。

2 个答案:

答案 0 :(得分:2)

所以我重新创建了您的错误:

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

如果您将得到相同的错误。原因是因为case语句中的ELSE返回一个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

答案 1 :(得分:0)

declare @input as smallint = 1;
select format(@input, 'X');