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 回答