0
Select Name from tblAnimal where Id=1

返品:私のペット

Select Id from tblAnimal where Name='My Pet'  --I copy/pasted this value in SSMS!

空のチェンジセットを返す(なぜ?)

いくつかの調査の結果、Char(10)とChar(13)である可能性があることがわかりました。それで、私のペットのコピー&ペーストを行うと、Char(10)が自動的にSpace for Windows環境に変換されると思いますか?

これは:

Select id from tblAnimal where Name like '%My%'  

1Whileを返します

select id from Animal where Name like '%My %'  

何も返しません。

質問。
1.なぜこれが起こっているのですか?
2.これを修正する方法(本番データベース、数百万レコード)
3.これを防ぐ方法は?

4

2 に答える 2

6

データをクリーンアップするには、CR/LFペアをスペースに置き換えます。

UPDATE dbo.table
  SET column = REPLACE(REPLACE(column, CHAR(10), ''), CHAR(13), ' ')
  WHERE CHARINDEX(CHAR(10), column) + CHARINDEX(CHAR(13), column) > 0;

そして、そもそもこのデータを防止することについてのポイントに対処するために、あなたはそれを確実に防ぐことができます、そしてこれはその防止が始まるべき場所です-あなたはすべての外部の方法をあまり制御できないので、可能な限りデータに近いです人々はあなたのテーブルにゴミを詰め込むことができます。すでにテーブルがあると仮定します。

CREATE TABLE dbo.blat(col VARCHAR(32));

制約を追加するのは簡単です。

ALTER TABLE dbo.blat ADD CONSTRAINT ck_col_NoCRLF
  CHECK(CHARINDEX(CHAR(10), col) + CHARINDEX(CHAR(13), col) = 0);

今:

INSERT dbo.blat(col) SELECT NULL;

動作します。

INSERT dbo.blat(col) SELECT 'howdy';

動作します。

INSERT dbo.blat(col) SELECT 'howdy
    partner';

失敗する:

メッセージ547、レベル16、状態0、1行
目INSERTステートメントがCHECK制約「ck_col_NoCRLF」と競合していました。データベース「test」、テーブル「dbo.blat」、列「col」で競合が発生しました。
ステートメントは終了されました。

他のさまざまな特殊文字を追加することも検討してください- CHAR(9)tab)も一般的な文字です。

于 2013-01-24T22:53:24.243 に答える
1

char10とchar13は改行とキャリッジリターンです。グリッドの結果にそのように表示されていても、スペースではありません。結果をSSMSで表示している場合は、結果をテキスト(ctrl + Tまたはツールバー)として表示するように指示するのが最適です。これを行うと、結果が実際に次のようになるかどうかがわかります。

My Pet

または

My
Pet

グリッドへの結果は、グリッドがMy Petどのように機能するかを示すため、1行で表示されます。テキストとしての結果は、単一のレコードであっても新しい行を表示するため、テーブル内のデータを正確に確認できます。

于 2013-01-24T21:29:38.047 に答える