Как проверить точную строку в таблице? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь вставить новые записи в мою таблицу.

. Всего 55 столбцов

, поэтому мне нужно проверить, существует ли какая-либо запись в таблице с такими же значениями во всех 54 столбцах.(за исключением столбца идентификаторов)

Я пытался задавать отдельные имена столбцов по отдельности, но это невозможно для всех столбцов

Любое предложение будет оценено по достоинству:)

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Если вам нужно проверять это всегда, а не только в данном конкретном случае, я могу предложить вам создать дополнительный столбец с CHECKSUM для всех остальных столбцов и проверить контрольную сумму новых строк по уже существующим.

Надеюсь, это сработает лучше, чем очевидная идея уникального индекса для всех столбцов

0 голосов
/ 14 июня 2019

Добавить хеш как сохраненный вычисляемый столбец

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

, а затем создайте уникальный индекс для этого столбца

0 голосов
/ 13 июня 2019

Выберите столбцы из таблиц sys и сгенерируйте SQL-оператор с предложением group by, как показано здесь:

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)

, в результате вы получите все столбцы с дополнительным количеством равных строк, первое (min) id и последний (max) id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...