如何确保字符串列没有空格?

Bil*_*ill 5 t-sql ssms sql-server-2008

我目前有一个主键字段nvarchar(50),如果我可以让它不接受空格,我愿意更改类型。有没有办法做到这一点?

应允许以下情况:

------
AAAA
BBBB
CCCC
Run Code Online (Sandbox Code Playgroud)

不应允许以下情况:

------
AA AAA
BBBB B
C CCCC
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 6

您可以添加以下检查约束:

CHECK LEN(col) = LEN(REPLACE(col, ' ', ''));

...或者...

CHECK (col NOT LIKE '% %');
Run Code Online (Sandbox Code Playgroud)

...或者...

CHECK (CHARINDEX(' ', col) = 0)
Run Code Online (Sandbox Code Playgroud)

例子:

USE tempdb;
GO

CREATE TABLE dbo.bar(foo NVARCHAR(50) PRIMARY KEY);

ALTER TABLE dbo.bar ADD CONSTRAINT chkNoSpaces
 CHECK (foo NOT LIKE '% %');
Run Code Online (Sandbox Code Playgroud)

成功:

INSERT dbo.bar(foo) SELECT 'AAAA';
GO
Run Code Online (Sandbox Code Playgroud)

失败:

INSERT dbo.bar(foo) SELECT 'AA AA';
GO
Run Code Online (Sandbox Code Playgroud)

结果:

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束“chkNoSpaces”冲突。冲突发生在数据库“tempdb”、表“dbo.bar”、列“foo”中。
该语句已终止。

清理:

DROP TABLE dbo.bar;
Run Code Online (Sandbox Code Playgroud)

编辑

如果您出于某种原因需要通过 UI 执行此操作(我再次建议您使用可以使原子化、可重复、保存到文件、存储在源代码管理中等的脚本执行此操作):

  1. 在对象资源管理器中,右键单击您的表并选择 Design
  2. 右键单击上方网格中的列,然后选择 Check Constraints...
  3. 点击 Add
  4. 键入column_name NOT LIKE '% %'“表达式”框(使用您的实际列名称,而不是column_name
  5. 如果您认为您已经有违反约束的数据,请将“检查现有数据...”选项更改为No(并立即修复该数据)
  6. 点击 Close
  7. 单击工具栏上的“保存”图标

请注意,UI 实际上更改了子句的构造,例如 (NOT col_name LIKE '% %')