有一张桌子:
<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
一切都很好。
答案 0 :(得分:3)
在SQL Server(Data Type Precendence (SQL Server))中,二进制在所有数据类型中的优先级最低:
SQL Server对数据类型使用以下优先顺序:
- 用户定义的数据类型(最高)
- sql_variant
- xml
- datetimeoffset
- datetime2
- 日期时间
- smalldatetime
- 日期
- 时间
- 浮动
- 真实
- 十进制
- 金钱
- 小钱
- bigint
- int
- smallint
- tinyint
- 位
- ntext
- 文本
- 图片
- 时间戳
- uniqueidentifier
- nvarchar(包括nvarchar(max))
- nchar
- varchar(包括varchar(max))
- char
- varbinary(包括varbinary(max))
- 二进制(最低)
使用CASE
表达式,所有返回值都隐式转换为返回值最高的数据类型。在这种情况下,您拥有int
值0
和binary(16)
值0x4cb47abddf8a9c348c7a7c20abd0b1d5
。在int
> binary
中,值0x4cb47abddf8a9c348c7a7c20abd0b1d5
转换为int
,因此会丢失数据。
如果数据的返回类型很重要,并且您在返回值中使用了多种数据类型,则将所有值显式转换为正确的类型。在这种情况下:
UPDATE Table1
SET Hash = CASE Id WHEN 1 THEN 0x4cb47abddf8a9c348c7a7c20abd0b1d5
ELSE CONVERT(binary(16),0)
END;