Sql 如何检查表中的确切行?

Sql 如何检查表中的确切行?,sql,sql-server,Sql,Sql Server,我正在尝试在表中插入新记录 它总共有55列 所以我需要检查表中是否已经存在一些记录,这些记录在所有54列中的值都是相同的 我试着单独给出特定的列名,但并不适用于所有的列 任何建议都将不胜感激:如果您需要始终检查此项,而不仅仅是针对此特定情况,我可以建议您使用所有其他列的校验和创建其他列,并根据现有列检查新行的校验和 我希望这比为所有列创建唯一索引的想法更好从sys表中选择列,并使用group by子句生成sql语句,如下示例: declare @tbl varchar(255) = 'your_

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

它总共有55列

所以我需要检查表中是否已经存在一些记录,这些记录在所有54列中的值都是相同的

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


任何建议都将不胜感激:

如果您需要始终检查此项,而不仅仅是针对此特定情况,我可以建议您使用所有其他列的校验和创建其他列,并根据现有列检查新行的校验和


我希望这比为所有列创建唯一索引的想法更好

从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。添加一个哈希作为持久化计算列

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

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

通常我建议创建一个唯一的索引,但我不知道它将如何处理这么多的列,不包括id。为什么它不适用于所有列?根据列的值进行选择,如果有结果,记录存在..55列,唯一?似乎是一个奇怪的db设计。不,它是可行的。唯一阻碍你的是懒惰。正如Mike所建议的,您可以编写代码来克服懒惰。但一定有什么地方写了这样的代码。继续。校验和列应该是一个计算列,或者由触发器管理。如果许多列可以为NULL,那么创建一个好的校验和可能会很困难。我猜是的,它应该是一个计算列,上面有唯一的索引,所以您不需要手动或使用触发器进行检查