J'essaye d'insérer de nouveaux enregistrements dans ma table
il a 55 colonnes au total
je dois donc vérifier si un enregistrement existe déjà dans la table avec les mêmes valeurs dans les 54 colonnes (sauf la colonne d'identité)
J'ai essayé de donner des noms de colonnes spécifiques individuellement, mais ce n'est pas possible pour toutes les colonnes
Toute suggestion sera appréciée :)
3 Réponses :
Si vous avez besoin de vérifier cela toujours et pas seulement pour ce cas particulier, je peux vous suggérer de créer une colonne supplémentaire avec CHECKSUM de toutes les autres colonnes et de vérifier la somme de contrôle des nouvelles lignes par rapport à celles déjà existantes.
J'espère que cela fonctionnera mieux que l'idée évidente d'un index unique pour toutes les colonnes
Et cette colonne de somme de contrôle doit être soit une colonne calculée, soit gérée par des déclencheurs.
Si de nombreuses colonnes peuvent être NULL , la création d'un bon CheckSum peut s'avérer difficile, je suppose
Oui, il doit s'agir d'une colonne calculée avec un index unique, vous n'avez donc pas besoin de la vérifier manuellement ou avec des déclencheurs
Sélectionnez les colonnes dans les tables sys et générez une instruction sql avec une clause group by comme cet exemple ici:
declare @tbl varchar(255) = 'your_table' -- <<<< your table
declare @tmp nvarchar(max) = ''
select @tmp = @tmp + column_name + ', '
from (SELECT o.name as table_name
,c.name AS column_name
,c.column_id
FROM sys.columns AS c
join sysobjects as o on c.object_id=o.id
where o.name = @tbl
and c.name not in ('id', 'add_date', 'edit_date') -- <<<< fields you don't want to compare
) as t1
declare @fields nvarchar(max) = (select substring(@tmp, 0, len(@tmp)))
declare @string nvarchar(max) = N'select ' + @fields + ', count(id) as no, min(id) as first_id, max(id) as last_id from dbo.' + @tbl + ' group by ' + @fields + ' having count(id)>1'
exec (@string)
en conséquence, vous avez toutes les colonnes avec en plus le nombre de lignes égales, le premier (min) id et dernier (max) id.
Ajoutez un hachage en tant que colonne calculée persistante
ALTER TABLE [YourTable]
ADD [HASH] AS (CONVERT([bigint]
,hashbytes('MD5'
,concat([Col 1],'|'
,[Col ...],'|'
,[Col i],'|'
,[Col ...],'|'
,[Col 54],'|'
)
)
)
)
PERSISTED
, puis créez un index unique sur cette colonne
normalement, je suggérerais de créer un index unique, mais je ne sais pas comment il fonctionnera avec autant de colonnes
Essayez
INTERSECTdocs.microsoft.com/en-us/sql/t-sql/language-elements/... sans id.Quelle est la raison pour laquelle "ce n'est pas faisable pour toutes les colonnes"? Une sélection basée sur les valeurs des colonnes serait la façon dont, s'il y a un résultat, l'enregistrement existe.
55 colonnes, unique? Cela ressemble à une conception de base de données étrange.
Non, c'est faisable. La seule chose qui se trouve sur votre chemin est la paresse. Vous pouvez, comme Mike le suggère, écrire du code pour surmonter la paresse. Mais quelque chose quelque part doit écrire ce code. Allez-y.