【发布时间】:2018-10-18 03:29:35
【问题描述】:
当我向现有的非空表添加具有默认约束 0x00000000000000000000000000000000 的新固定长度 varbinary 列时,表中的现有记录正在接收默认约束 0x00 的修剪版本。
新记录的后续插入确实正确应用了默认约束。
这只发生在 SQL 2017 中,以前的 SQL 版本正确地将默认约束应用于所有现有记录。
包含 'SET ANSI_PADDING ON' 不会影响结果。
0x11111111110000000... 也以相同的方式运行,它会修剪尾随零。
我也尝试过使用默认值DEFAULT Cast(0x00000000000000000000000000000000 as varbinary(16)),但结果相同。
运行 Microsoft SQL Server 2017 (RTM-CU11) (KB4462262) - 14.0.3038.14 (X64)
复制:
create table #test (id int);
insert into #test (id) values (1), (2), (3);
alter table #test add testvarbinary VARBINARY(16) NOT NULL CONSTRAINT
DF_MyTable_NewColumn DEFAULT 0x00000000000000000000000000000000;
insert into #test (id) values (4);
select * from #test;
结果:
+----+------------------------------------+
| id | testvarbinary |
+----+------------------------------------+
| 1 | 0x00 |
| 2 | 0x00 |
| 3 | 0x00 |
| 4 | 0x00000000000000000000000000000000 |
+----+------------------------------------+
【问题讨论】:
-
@MitchWheat 使用的 TSQL 与上面的添加列相同,我只是修改了表/列名称,之后的插入只是 INSERT INTO MyTable (Id) VALUES (1) 其中 MyTable 有 Id 列和新列。如前所述,SQL 2016 上完全相同的 TSQL(一直到 2005 年)表现相同,只是在 SQL 2017 中表现不同。我明天回到办公桌后会尝试 Cast。
-
@MitchWheat 我刚刚添加了编辑 3 和要重现的代码。
-
对不起,同样的结果。创建表#test(id int);插入#test(id)值(1),(2),(3); alter table #test add testvarbinary VARBINARY(16) NOT NULL CONSTRAINT DF_test DEFAULT Cast(0x000000000000000000000000000000000 as varbinary(16));插入#test(id)值(4);从#test中选择*;给出: id testvarbinary 1 0x00 2 0x00 3 0x00 4 0x00000000000000000000000000000000
-
我们在 SO 上有编辑历史。您可以考虑将您的问题浓缩为一个连贯的问题,而不使用所有单独的 Edit 标记。
-
感谢您的帮助,我已经报告了uservoice。
标签: sql sql-server tsql sql-server-2017