如何检查表中存在的确切行?

时间:2019-06-13 07:13:08

标签: sql sql-server

我正在尝试在表中插入新记录

总共有55列

所以我需要检查表中是否已存在所有54列(标识列除外)中具有相同值的记录

我尝试单独给出特定的列名,但不适用于所有列

任何建议将不胜感激:)

3 个答案:

答案 0 :(得分:1)

如果您不仅需要针对这种特殊情况始终进行检查,我建议您使用CHECKSUM创建所有其他列的附加列,并针对已经存在的校验和检查新行的校验和。

我希望这将比所有列的唯一索引的明显想法更好

答案 1 :(得分:0)

从sys表中选择列,并使用group by子句生成一个sql语句,如下所示:

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)

因此,您拥有的所有列均具有相等的行数,第一个(最小)id和最后一个(最大)id。

答案 2 :(得分:0)

将哈希添加为持久计算列

ALTER TABLE [YourTable]
ADD [HASH]  AS (CONVERT([bigint]
                       ,hashbytes('MD5'
                                 ,concat([Col 1],'|'
                                        ,[Col ...],'|'
                                        ,[Col i],'|'
                                        ,[Col ...],'|'
                                        ,[Col 54],'|'
                                        )
                                 )
                       )
               )
PERSISTED

,然后在该列上创建唯一索引