Binary(16)在CASE语句中截断为binary(4)

时间:2019-04-19 12:57:43

标签: sql sql-server

有一张桌子:

<head>


<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>


<div id="app">
<table >
 <tr>
 <th rowspan="2" @click="sort(['deviceName'])">Device Info</th>
 </tr>
 <tr>
 <th v-for="(toolAttribute, index) in results.toolAttribute" :key="index" @click="activeColumn = toolAttribute" :class="{active: toolAttribute == activeColumn}">{{toolAttribute.attributeName}}
 <span @click="sort(['info', index, 'value']); toolAttribute.order = toolAttribute.order * (-1)" :class="toolAttribute.order > 0 ? 'glyphicon glyphicon-chevron-down' : 'glyphicon glyphicon-chevron-up'" v-show="toolAttribute == activeColumn"></span>
 <span class="glyphicon glyphicon-sort" v-show="toolAttribute != activeColumn"></span></th>
 </tr>
 <tr v-for="(device, index) in sortedResults"  >
  <td :class="{'falseclass' : flasecond(index)}">{{ device.deviceName }}</td>
  <td v-for="info in device.info" :class="{'falseclass' : !info.value}">{{info.value}}</td>
</tr>
</table>
</div>
</body>

有数据:

CREATE TABLE [db].[Table1](
    [Id] [int] NOT NULL,
    [Hash] [binary](16) NOT NULL
) 

并尝试执行SQL:

Id Hash
1  0x00000000000000000000000000000000
2  0x00000000000000000000000000000000

预计“哈希”列中的值为0x4cb47abddf8a9c348c7a7c20abd0b1d5,但实际值为0x00000000000000000000000abd0b1d5。

如果我尝试:

UPDATE Table1 SET Hash = CASE Id
WHEN 1 THEN 0x4cb47abddf8a9c348c7a7c20abd0b1d5
ELSE 0
END

一切都很好。

1 个答案:

答案 0 :(得分:3)

在SQL Server(Data Type Precendence (SQL Server))中,二进制在所有数据类型中的优先级最低:

  

SQL Server对数据类型使用以下优先顺序:

     
      
  1. 用户定义的数据类型(最高)
  2.   
  3. sql_variant
  4.   
  5. xml
  6.   
  7. datetimeoffset
  8.   
  9. datetime2
  10.   
  11. 日期时间
  12.   
  13. smalldatetime
  14.   
  15. 日期
  16.   
  17. 时间
  18.   
  19. 浮动
  20.   
  21. 真实
  22.   
  23. 十进制
  24.   
  25. 金钱
  26.   
  27. 小钱
  28.   
  29. bigint
  30.   
  31. int
  32.   
  33. smallint
  34.   
  35. tinyint
  36.   
  37.   
  38. ntext
  39.   
  40. 文本
  41.   
  42. 图片
  43.   
  44. 时间戳
  45.   
  46. uniqueidentifier
  47.   
  48. nvarchar(包括nvarchar(max))
  49.   
  50. nchar
  51.   
  52. varchar(包括varchar(max))
  53.   
  54. char
  55.   
  56. varbinary(包括varbinary(max))
  57.   
  58. 二进制(最低)
  59.   

使用CASE表达式,所有返回值都隐式转换为返回值最高的数据类型。在这种情况下,您拥有int0binary(16)0x4cb47abddf8a9c348c7a7c20abd0b1d5。在int> binary中,值0x4cb47abddf8a9c348c7a7c20abd0b1d5转换为int,因此会丢失数据。

如果数据的返回类型很重要,并且您在返回值中使用了多种数据类型,则将所有值显式转换为正确的类型。在这种情况下:

UPDATE Table1
SET Hash = CASE Id WHEN 1 THEN 0x4cb47abddf8a9c348c7a7c20abd0b1d5
                   ELSE CONVERT(binary(16),0)
                   END;