为什么SSDT仅对某些表显示一些小的更改?

时间:2019-01-28 15:05:34

标签: sql visual-studio visual-studio-2015 azure-sql-database sql-server-data-tools

在我的.sqlproj项目中,我有许多SQL数据库表,这些表的列具有默认约束,例如:

 CREATE TABLE TableName
(
-- Some other columns defined too
[State] TINYINT NOT NULL DEFAULT (0),
)

当我针对生产数据库运行项目的SSDT 模式比较时,会发生以下情况。据报告,有些表格与上面的表格没有区别,而另一表格则具有以下区别。

比较工具说该项目具有此功能(这是正确的,对于所有其他表也是如此):

-- Single braces around zero
[State] TINYINT DEFAULT (0) NOT NULL

但是数据库有这个:

-- Double braces around zero
[State] TINYINT DEFAULT ((0)) NOT NULL

这很烦人,因为它导致报告了许多无用的更改。更令人烦恼的是,我有大约十个具有此类列定义的表,但差异仅报告一个表。

我尝试打开SSMS并右键单击生产数据库中的表和脚本表创建到新窗口,它在创建脚本中产生以下行:

ALTER TABLE [dbo].[TableName]
  ADD  DEFAULT ((0)) FOR [State]

所有表都发出相同的结果,但是差异仅在比较中报告一个表。

我该如何解决?我怎么知道为什么这个表是 special ,为什么只报告该表的差异?

1 个答案:

答案 0 :(得分:0)

这是已解决的SSDT的一个旧问题-现在,当SSDT从数据库中导入它用来生成差异列表的模型时,删除了括号,并比较了保留的表达式,因此首先下载最新的SSDT。

我已经检查过,问题出在SSDT的12.0版本中,并在14.0中得到了修复,因此该修复程序位于两者之间。

我只需将所有默认设置都设置为(())-要么手动执行,要么将数据库与项目进行比较,这首先会做两件事,这意味着您不会再得到这些烦人的东西事情,其次,它将使比较快一点。

如果存储在SSDT项目中的版本没有两个(和)包装,则表达式SSDT会经历一个附加步骤,即从从数据库中检索的脚本中删除(的)。但是,如果您具有((x)),则SSDT知道数据库也将具有((x)),因此不必删除多余的括号。

所以,1-升级,2-正确放置。

编辑