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であり、CHAR/NCHAR末尾にスペースがあります (または末尾のスペースは他の理由で考慮されています)。試す:

WHERE RTRIM(search_term) = 'b';

また、トリム操作の影響を受けないタブ/キャリッジ リターンを削除する必要がある場合もあります。

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

上記のクエリはどちらもインデックスを使用できないことに注意してください。そのため、インデックスがある場合はsearch_term、列をvarcharorに変更した後にインデックスを再構築nvarcharし、パディング設定と空白が問題を引き起こしていないことを確認する必要があります。

その他の推測: @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 に答える