【问题标题】:How do I make sure a string column has no spaces?如何确保字符串列没有空格?
【发布时间】:2012-05-29 07:22:26
【问题描述】:

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

应允许以下内容:

------
AAAA
BBBB
CCCC

不应允许以下内容:

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

【问题讨论】:

  • 检查 (CHARINDEX(key_column,' ') = 0 )

标签: sql-server-2008 tsql ssms


【解决方案1】:

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

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. 点击添加
  4. 在“表达式”框中输入column_name NOT LIKE '% %'(使用您的实际列名,而不是column_name
  5. 如果您认为您已经有违反约束的数据,请将“检查现有数据...”的选项更改为 (并立即修复该数据)
  6. 点击关闭
  7. 点击工具栏上的“保存”图标

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

【讨论】:

  • 在 Managment Studio 中有没有办法做到这一点?
  • 是的,但是遍历所有 UI 对话框很复杂。这也是您无法保存在脚本或源代码管理中的内容。为什么需要使用 Management Studio 来执行此操作?
  • Why not?: CHECK CHARINDEX(N' ',col) = 0 我喜欢比较这些长度以计算出现次数的技巧,但似乎 CHARINDEX 应该只需要扫描字符串一次(最多)并且在不了解内部结构的情况下,REPLACE 和两个 LEN 似乎更昂贵。
  • 好的,我试试看。谢谢。当它可用时,我会批准这个答案。
  • @AaronBertrand 我同意,但只是想我会大声疾呼,以便张贴者了解实际行为。我已经被 LEN 的修剪“功能”咬住了,所以每当我看到它时,我的脑海中就会响起警报。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多