2

SQLでREPLACE関数を使用しようとしていますが、列の現在の内容の最後に文字列を追加しようとすると問題が発生します。

set ActualRegex = REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*') 

これらの文字列はC#プログラムの正規表現チェックに使用されますが、これは特に問題とは関係ありません。

このクエリを実行しようとすると、エラーメッセージが表示されます

Msg 8152, Level 16, State 14, Line 1
String or binary data would be truncated.
The statement has been terminated.

フィールドサイズを確認しましたが、結果の文字列はフィールドのサイズ(varchar(512))を超えるほど長くはなりません。私が知らない何か奇妙なことが起こっていない限り、最大で50文字の長さになる可能性があります。

助けてくれてありがとう!

編集:これが完全なクエリです

update [Registration].[dbo].[MigrationOfTagTypes] set ActualRegex = 
REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*') 
where Regex != '' and Regex like '%\%' escape '\'

編集:実際、私はそれを理解し、私はただ愚かで小さな何かを見落としていたことがわかりました。どうやらこれらのフィールドは文字列の最後に追加されたたくさんの空の空白で埋められていたので、それに追加するとサイズの制約が破られることになります。 すべての助けをありがとう!

4

3 に答える 3

2
Msg 8152, Level 16, State 14, Line 1
String or binary data would be truncated.
The statement has been terminated.

これには2つの理由があります。

  1. varchar列が十分に大きくありません。varchar(15)列の既存の10文字に7文字を追加しても機能しません
  2. あなたの列はcharとして定義されています(なぜ?!)。char列には暗黙の末尾スペースがあるため、「XYZ」を含むchar(10)フィールドに「ABC」を追加すると、実際には、char(10)よりも長い「XYZABC」(13)になります。

2番目のケース、つまりchar列では、RTRIMを使用します

update [Registration].[dbo].[MigrationOfTagTypes] set ActualRegex = 
RTRIM(REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*')) 
where Regex != '' and Regex like '%\%' escape '\'

注:このよう'ABCxxxABC'に置換を使用すると、'ABC[\d\D]*xxxABC[\d\D]*'

単にしたい場合append to the end of the columnは、

update [Registration].[dbo].[MigrationOfTagTypes]
set ActualRegex = RTRIM(ActualRegex) + '[\d\D]*'
where Regex != '' and Regex like '%\%' escape '\'
于 2012-09-27T20:40:39.493 に答える
0

concatの方が便利な可能性はありますか?

エラーメッセージに関しては、なぜ生成されるのかわかりませんが、前回MSSQLを使用してからしばらく経ちました。

于 2012-09-27T20:33:25.110 に答える
0

あなたのコラムが無限に再帰的に集約されている可能性があると思います。または少なくとも512文字を広告します。

この場合、現在のテーブルの内容を一時テーブルにオフロードしてから、そのデータを使用して元のテーブルに更新を戻す必要があります。

私はこれが今可能かどうかを調査しています。

于 2012-09-27T20:40:47.233 に答える