Je ne vais pas plonger dans POURQUOI vous devez le faire sur chaque colonne dans DB, il semble étrange, mais je laisse cela à vous.
Voici comment vous le faites (vous ne l'avez pas spec quelle contrainte tho)
Faire une table temporaire sur toutes les tables colonnes de cette combinaison de table
itérer sur cette cueillette de table la 1ère
Définir votre contrainte en utilisant le tableau et le nom de la colonne, peut-être obtenir des choses supplémentaires aussi bien, dépend de ce que contraignent est
- Après avoir ajouté la contrainte, supprimer cet enregistrement de la table temporaire si un autre devient supérieure 1.
- continuer à le faire au-dessus de 2 balles jusqu'à ce que la table tassez est vide
Cela a été testé sur le serveur SQL, régler le code si vous avez besoin d'autres SGBD. Mais le principe est le même:
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
Uncomment les parties pour voir les valeurs commentaires-colonne de table sélectionnée ou voir comment il itère.
EDIT 1: Ajout du where type = 'U'
pour obtenir de system.objects
seulement ceux définis par l'utilisateur.
EDIT 2: Élargissement de la clause where, maintenant il ne prend que des colonnes varchar et nvarchar de tables sur l'utilisateur
Juste une pensée qui passe ... Peut-être 'ascii (à droite ([ColumnName], 1))> 32' pour éviter les caractères de contrôle redoutés comme CRLF –