0

当主键在新表上时,由于主键约束,我遇到了表复制错误的问题。在通过不设置主键进行一些调查时,我能够在我的源表中找到一个重复的行,仍然不确定它是如何进入那里的,但我更好奇的是我发现的其余部分。

开始:

我有一个 SQL 查询,它选择整个表并返回以下内容:

SELECT *
 FROM search_term_suggest
 order by search_term

你可以看到这个值是重复的,我不得不滚动表格来找到它。

SQL 结果

但是当我将查询限制为:

SELECT *
 FROM search_term_suggest
 where search_term = 'b'

你可以看到它过滤掉了第一个值。数据库上没有触发器或任何我能看到的会限制选择查询的东西。

SQL 结果与

我正在运行 SQL 2008 r2。任何帮助是极大的赞赏。我将表复制到的数据库是 SQL 2000 数据库,当使用与上面相同的查询进行选择时,我得到了我期望的结果。

编辑: search_term 是 varchar(100),search_term_suggest 是表而不是视图。

4

3 回答 3

5

我的猜测:search_term是 aCHAR/NCHAR并且有尾随空格(或出于其他原因正在考虑尾随空格)。尝试:

WHERE RTRIM(search_term) = 'b';

您可能还需要消除不受修剪操作影响的制表符/回车符。

WHERE LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(search_term,
  CHAR(9), ''), CHAR(10), ''), CHAR(13), ''))) = 'b';

请注意,上述两个查询都禁止使用索引,因此如果有索引,search_term您可能应该在将列更改为varcharornvarchar并确保填充设置和空格不会导致问题后重建它。

其他猜测:正如@Dems 指出的那样,检查第一个查询中两列的长度。还尝试将您的 where 子句更改为以下内容,仅用于调查目的:

WHERE search_term LIKE 'b%'
  AND LEN(search_term) > 1;

如果你在那里得到任何结果,那么你可以说:

DECLARE @val VARCHAR(100), @i INT;

DECLARE c CURSOR LOCAL STATIC READ_ONLY FAST_FORWARD 
  FOR SELECT search_term FROM dbo.search_term_suggest
  WHERE search_term LIKE 'b%'
    AND LEN(search_term) > 1;

OPEN c;

FETCH NEXT FROM c INTO @val;

WHILE @@FETCH_STATUS = 0
BEGIN
  SET @i = 1;
  PRINT '-----' + @val + ' (' + RTRIM(LEN(@val)) + ')';
  WHILE @i <= LEN(@val)
  BEGIN
    PRINT SUBSTRING(@val, @i, 1) + ' = ' + ASCII(SUBSTRING(@val, @i, 1));
    SET @i = @i + 1;
  END

  FETCH NEXT FROM c INTO @val;
END
CLOSE c;
DEALLOCATE c;

这将帮助您解决该列中的内容,除了b- 它可能是您尚未检查的空格(例如制表符或回车)或其他非打印字符。

于 2012-07-03T16:26:02.973 回答
3

会不会是在 29645 行中 search_term 值不是“b”,而是“b”(即 b 后跟空格)

于 2012-07-03T16:25:54.923 回答
0

它不能是 ab,只是在屏幕上看起来像 ab 的东西,特别是如果该列有约束。如果将查询结果复制到文本中,是否可以在文本编辑器中搜索“b”并找到它?

于 2012-07-03T16:42:41.863 回答