我正在尝试在表中插入新记录
总共有55列
所以我需要检查表中是否已存在所有54列(标识列除外)中具有相同值的记录
我尝试单独给出特定的列名,但不适用于所有列
任何建议将不胜感激:)
答案 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
,然后在该列上创建唯一索引