在SQL-Server中是否有快速方法可以为空数据库中的所有表中的所有列添加约束?
我想为所有列添加约束,以防止用户使用前导/尾随空格和空字符串。 以下是我想添加的约束:
RIGHT([ColumnName],1) <> ' '
&amp;&amp;LEFT([ColumnName],1) <> ' '
&amp;&amp;([ColumnName]<>'')
我意识到你可以为一个列添加一个约束但是如果数据库有很多具有更多列的表,你会怎么做,它需要一段时间才能为所有列添加单个约束。我正在寻找更有效的解决方案
答案 0 :(得分: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子句,现在只需要用户制作表中的varchar和nvarchar列
答案 1 :(得分:0)
在数据库中的任何地方添加此类约束并不是一个好主意。我认为用户不会直接向数据库添加数据,因此您应该在将数据添加到表格或表示层的区域中处理此问题。