显式定义列排序规则,即使它是数据库默认排序规则

Jez*_*Jez 2 sql-server collation

如果排序规则是数据库默认值,SQL Server 似乎会不遗余力地删除COLLATE对列的限制。nvarchar我的数据库默认是SQL_Latin1_General_CP1_CI_AS. 如果我这样创建一个表:

CREATE TABLE [dbo].[UserActive](
    [Id] [uniqueidentifier] NOT NULL,
    [DateCreated] [datetimeoffset](7) NOT NULL,
    [Username] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Password] [nvarchar](max) NULL,
    [Email] [nvarchar](254) NOT NULL,
 CONSTRAINT [PK_UserActive] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

...然后要求 SQL Server Management Studio 将表编写为CREATE语句,我得到以下结果:

CREATE TABLE [dbo].[UserActive](
    [Id] [uniqueidentifier] NOT NULL,
    [DateCreated] [datetimeoffset](7) NOT NULL,
    [Username] [nvarchar](50) NOT NULL,
    [Password] [nvarchar](max) NULL,
    [Email] [nvarchar](254) NOT NULL,
 CONSTRAINT [PK_UserActive] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

有什么方法可以保留显式COLLATE即使它是数据库默认值吗?我想明确说明这样一个事实:我在列上添加的任何唯一索引都Username将具有不区分大小写的排序规则,即使数据库默认值由于某种原因发生了更改。它很好并且是自记录的,如果没有显式排序规则作为表定义的一部分,它就会丢失。

Dan*_*man 5

SSMS 脚本选项(工具-->选项-->SQL Server 对象资源管理器-->脚本-->表和视图选项)允许您在编写对象脚本时包含COLLATE(或不包含)子句:

SSMS 脚本选项

  • @Jez,似乎您应该将源代码(脚本)保存在版本控制系统中,而不是进行逆向工程。这将提供对整理子句的完全控制。 (3认同)