5

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

应允许以下内容:

------
AAAA
BBBB
CCCC

不应允许以下情况:

------
AA AAA
BBBB B
C CCCC
4

1 回答 1

6

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

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

...或者...

CHECK (col NOT LIKE '% %');

...或者...

CHECK (CHARINDEX(' ', col) = 0)

例子:

USE tempdb;
GO

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

ALTER TABLE dbo.bar ADD CONSTRAINT chkNoSpaces
 CHECK (foo NOT LIKE '% %');

成功:

INSERT dbo.bar(foo) SELECT 'AAAA';
GO

失败:

INSERT dbo.bar(foo) SELECT 'AA AA';
GO

结果:

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

清理:

DROP TABLE dbo.bar;

编辑

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

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

请注意,用户界面实际上改变了子句的结构,例如(NOT col_name LIKE '% %')

于 2012-05-22T18:51:33.797 回答