0

このテーブルに重複する行があるかどうかをチェックする、テーブル名をパラメーターとしてストアド プロシージャを作成しました。もちろん、ステートメントは動的に構築されます。

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また、これらのテーブルには主キーがないため、このテーブルの主キーを照会することはできません。

何か案は?ありがとう。

4

1 に答える 1

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')
于 2013-02-07T08:26:25.220 に答える