Общая процедура удаления дубликатов - без ПК

Я написал хранимую процедуру с именем таблицы в качестве параметра, который проверяет наличие дубликатов строк в этой таблице. Операторы построены динамически, конечно:

INSERT INTO tmpTable
SELECT col1, col2,... FROM table GROUP BY col1, col2, ... HAVING COUNT(*) > 1;

DELETE FROM tablename FROM tablenname 
INNER JOIN tmpTable ON ISNULL(tablename.col1, 0) = ISNULL(tmpTable.col1, 0)
AND ISNULL(tablename.col2, 0) = ISNULL(tmpTable.col2, 0)
AND ...;

INSERT INTO tablename SELECT * FROM tmpTable;

Должна работать до сих пор, но проблема в том, что она терпит неудачу, когда в таблице есть столбцы blob, такие как текст. Их нельзя сравнивать в JOIN . Я также пробовал

DELETE FROM tablename GROUP BY col1, col2, ... HAVING COUNT(*) > 1;

но GROUP BY не поддерживается в операторе DELETE напрямую без самоподключения.

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

Есть идеи? Благодарю.

0
nl ja de

1 ответы

Поскольку инструкция уже построена динамически, добавьте выделение соответствующих столбцов в varchar (max) для объединения. Нетрудно понять, какие столбцы:

select c.name, quotename(c.name, '[')
from
  sys.columns c
  inner join sys.types t on c.system_type_id = t.system_type_id
where
  c.object_id = object_id(@TABLE_NAME)
  and c.is_computed = 0
  and t.name in ('text', 'image', 'timestamp', 'xml')
1
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)