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

时间:2012-05-22 18:49:49

标签: sql-server-2008 tsql ssms

我目前有nvarchar(50)的主键字段,我愿意更改类型,如果我可以让它不接受空格。反正有吗?

应该允许以下内容:

------
AAAA
BBBB
CCCC

不应允许以下内容:

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

1 个答案:

答案 0 :(得分:3)

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

<击> 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

结果:

  

Msg 547,Level 16,State 0,Line 1
INSERT语句冲突   使用CHECK约束“chkNoSpaces”。冲突发生在   数据库“tempdb”,表“dbo.bar”,列'foo'。该声明有   已被终止。

清理:

DROP TABLE dbo.bar;

修改

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

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