2017-10-17 97 views
0

在SQL-Server中,是否有快速方法将约束添加到空数据库中所有表中的所有列?为所有表中的所有列添加约束条件

我想为所有列添加约束以防止用户使用前导空格和尾随空格以及空字符串。 这里有限制,我想补充: RIGHT([ColumnName],1) <> ' ' & & LEFT([ColumnName],1) <> ' ' & & ([ColumnName]<>'')

我知道你可以在一个约束添加到列,但你会怎么做,如果数据库中有大量的表格与连更多的列,它需要一段时间才能为所有列添加单个约束。我正在寻找更高效的解决方案

+1

只是路过想法...也许'ASCII(右([的ColumnName],1))> 32' VARCHAR和nvarchar列以避免可怕的控制字符,如CRLF –

回答

2

我不会潜入为什么你需要在DB的每一列上做它,这似乎很奇怪,但我把它留给你。

这里是你如何做到这一点(你不符合规范约束什么THO)

做一个临时表,每表列从该表中组合

  • 遍历该表采摘一日一

  • 设置使用表和列名,也许得到一些额外的东西,以及,你的约束取决于什么限制它是

  • 后添加的约束,删除临时表中的记录等等一个又一个成为顶级1.
  • 保持上述2枚子弹做,直到夯实表是空的

这SQL服务器上进行了测试,调整代码如果你需要其他DBMS。但原理是一样的:

 select 
     o.name as Tab,c.name as Col 
    into #temp 
     from sys.columns   c 
      inner join sys.objects o on c.object_id=o.object_id 
     where type = 'U' -- only user defined 
       and (t.name = 'varchar' or t.name = 'nvarchar') -- only columns with this datatypes 
     order by o.name,c.column_id 

    -- select * from #temp 

    DECLARE @tab nvarchar(max) 
    DECLARE @col nvarchar(max) 

    while ((select count(*) from #temp) > 0) 
     BEGIN 
     set @tab = (select top 1 Tab from #temp) 
     set @col = (select top 1 Col from #temp) 
     -- add your constraint here 
     -- select @tab, @col 
     delete from #temp where Tab = @tab and Col = @col 
     END 

    drop table #temp 

取消注释注释部分以查看选定的表列值或查看它是如何迭代的。

编辑1:增加了where type = 'U'system.objects得到只有用户定义的。

编辑2:扩展where子句,现在只需要由用户进行的表

+2

这将是一个好主意,把一个where子句只会得到varchar和nvarchar字段,并且也不会获得任何系统表 – GuidoG

+0

他在我发布答案后改变了问题。它用来明确说出所有的表,并没有说明哪些约束。 – DanteTheSmith

+0

我已阅读原始问题,我的评论依然存在。试图消除其他字段类型中的空格是没有意义的,当然不是在系统表和视图中。不要误解我的意思,我认为你的答案很好,只需要一些微调 – GuidoG

0

在数据库中的每个地方添加这种类型的约束并不是一个好主意。我认为用户不会直接向数据库添加数据,因此您应该在数据添加到表格或表示层的区域处理此问题。

+2

是否最适用于数据库后端的限制和验证?如果我不在后端添加它,那么“流氓”前端表单可能会出现空串的情况。 – Rhdr

+0

我总是尽可能多地放在数据库上,然后再放在前端。它的双重工作,但它的唯一途径,以确保 – GuidoG

+0

当然,你可以在后端使用约束,他们被介绍,因为它们是必要的和有用的。但我告诉你正在寻找的约束类型。您始终可以在前端应用验证。你可以看看关于sql server约束[Here](https://technet.microsoft.com/en-us/library/ms189862(v=sql.105).aspx) –

相关问题