「ファイル名」列を持つテーブルがあります。最近、この列に挿入を実行しましたが、急いで、入力したすべてのファイル名にファイル拡張子を追加するのを忘れていました。幸いなことに、それらはすべて「.jpg」画像です。
これらの挿入されたフィールドの「ファイル名」列を簡単に更新して (既知の ID 値に基づいて最近の行を選択できると仮定して)、「.jpg」拡張子を含めるにはどうすればよいですか?
「ファイル名」列を持つテーブルがあります。最近、この列に挿入を実行しましたが、急いで、入力したすべてのファイル名にファイル拡張子を追加するのを忘れていました。幸いなことに、それらはすべて「.jpg」画像です。
これらの挿入されたフィールドの「ファイル名」列を簡単に更新して (既知の ID 値に基づいて最近の行を選択できると仮定して)、「.jpg」拡張子を含めるにはどうすればよいですか?
解決策は次のとおりです。
UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50
そうしないと、[filename] 列全体が文字列連結に選択されるため、RTRIM が必要です。つまり、それが varchar(20) 列で、ファイル名の長さが 10 文字しかない場合でも、それらの 10 文字と 10 個のスペースが選択されます。20 + 3 文字を 20 文字の長さのフィールドに収めようとすると、エラーが発生します。
MattMitchell の答えは、列が CHAR(20) の場合は正しいですが、VARCHAR(20) でスペースが明示的に入力されていない場合は正しくありません。
RTRIM 関数を使用せずに CHAR フィールドで実行すると、「文字列またはバイナリ データが切り捨てられます」というエラーが発生します。
簡単でいいと思います。
update MyTable
set filename = filename + '.jpg'
where ...
編集:rtrimの提案に対する@MattMitchellの回答に+1してください。
David Bの「Life Lesson」を調整したかった。「可変長文字列値にcharを使用しないでください」であるべきだと思います-> charデータ型には有効な用途がありますが、一部の人が考えるほど多くはありません:)
元のデータが (このテーブルに挿入される前に) char 列または変数から取得された場合、元のデータには varchar になる前にスペースが追加されています。
DECLARE @Name char(10), @Name2 varchar(10)
SELECT
@Name = 'Bob',
@Name2 = 'Bob'
SELECT
CASE WHEN @Name2 = @Name THEN 1 ELSE 0 END as Equal,
CASE WHEN @Name2 like @Name THEN 1 ELSE 0 END as Similiar
人生の教訓 : 決して char を使用しないでください。
末尾のスペースの謎に対する答えは、ANSI_PADDING にあります。
詳細については、次を参照してください: SET ANSI_PADDING (Transact-SQL)
デフォルトは ANSI_PADDIN ON です。これは列が作成されたときにのみ影響し、既存の列には影響しません。
更新クエリを実行する前に、データを確認してください。侵害された可能性があります。
次のクエリを実行して、侵害された行を見つけます。
SELECT *
FROM tablename
WHERE LEN(RTRIM([filename])) > 46
-- The column size varchar(50) minus 4 chars
-- for the needed file extension '.jpg' is 46.
これらの行は、一部の文字が失われたか、ファイル拡張子を追加するための十分なスペースがありません。