【问题标题】:Why does SSDT Schema compare showing collation as a difference?为什么 SSDT Schema 比较显示排序规则是不同的?
【发布时间】:2022-06-10 16:57:19
【问题描述】:

我有一个带有表、存储过程等的 Visual Studio 数据库项目 (SQL Server)。这些表定义了排序规则,例如:

CREATE TABLE [dbo].[TestTable]
(
    [TestColumn] [varchar] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
);

数据库默认排序规则也是SQL_Latin1_General_CP1_CI_AS。 我使用sqlpackage 发布,ScriptDatabaseCollation 设置为 True。

当我从任何方向修改表格(例如添加新列)并使用 SSDT 比较工具时,即使“忽略排序规则”设置为 True,它也会将排序规则显示为不同:

另外,另一个有趣的是,当我点击生成脚本时,它不会包含任何排序规则修改,只是新列。

当我尝试从另一个方向进行比较(直接更新数据库并使用从数据库到本地项目的比较)时,情况更糟,因为它会更新我的文件并删除排序规则。

系统信息:

  • SSDT 版本 17.0.62204.01010
  • MSSQL Server Express 15.0.4153.1
  • Visual Studio 专业版 2022 17.2.2

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 您项目的默认排序规则是什么?
  • 同数据库:SQL_Latin1_General_CP1_CI_AS

标签: sql-server visual-studio sql-server-data-tools


【解决方案1】:

我只能假设 SSDT 正试图删除它认为不必要的“过度”DML。由于您的列的排序规则与项目的排序规则相同,因此再次重复它并没有多大意义(至少从 SSDT 的角度来看)。

如果/当您有多个具有不同默认排序规则的数据库实例时,您可能会喜欢这种行为。说到这里,我希望你知道你在做什么,选择一个非常古老的problematic SQL 排序规则作为你系统的默认值。

话虽如此,SSDT 并不总是从您的 DML 中删除 collate 子句。如果您指定的列排序规则与项目的默认排序规则不同,则在模式比较后它不会消失(假设源和目标具有相同的排序规则)。例如,在我最近的一个项目中,我需要几列区分大小写,所以我在 SSDT 中将它们设置为Latin1_General_100_CS_AS。经过几个月的开发工作,这些条款没有任何意义。

如果出于某种未知原因,在代码中保留这些collate 子句绝对是最重要的,您可以将项目的默认排序规则设置为其他内容。这将阻止 SSDT 清除噪音。但是,您需要小心模式比较和 DACPAC 部署。在前者中,您有以下选择:

  • “使用目标排序规则比较”(默认清除),
  • “忽略列排序规则”(默认清除),
  • “验证排序规则兼容性”(默认设置)。

(不确定后者,因为我从未使用过。)

但是,每次您需要比较架构时,转到架构比较设置对话框很快就会变得乏味而难以忍受。我建议您同意 SSDT 并删除您并不真正需要的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-10-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多