14

MS SQL SERVER 2003を使用しています。テーブルの1つの列を変更して、エントリの文字数を減らしたいと考えています。これは、この質問と同じです。より多くの文字を受け入れるのではなく、より少ない文字が必要であるという事実を除いて、より多くの文字を受け入れるようにテーブル列を変更します。

テーブルの1つに、9桁のエントリを保持する列があります。以前にテーブルで作業していた開発者が、誤って列を10桁のエントリを保持するように設定しました。CHAR(10)タイプをからに変更する必要がありCHAR(9)ます。

上にリンクされた議論からの指示に従って、私は声明を書きました

ALTER TABLE [MY_TABLE] ALTER COLUMN [MY_COLUMN] CHAR(9);

これにより、「文字列またはバイナリデータが切り捨てられます」というエラーメッセージが返されます。9桁の文字列には、10桁にするためのスペースが追加されていることがわかります。

余分なスペースを破棄して列をCHAR(9)タイプに変換するようにSQL Serverに指示するにはどうすればよいですか?

4

3 に答える 3

16

そのテーブルには正確に10文字の長さの値がいくつかあるため(末尾にスペースがないため)、エラーが発生すると思います。したがって、テーブルを変更すると、これらの値が長さ9にカットされます。

これはデフォルトでは許可されていません。末尾にスペースがある文字列しかない場合は、問題ありません。

したがって、これらの値を削減しても問題がない場合は、

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

まず、変更を行います。

于 2010-06-16T14:16:55.653 に答える
11

テーブルを変更する前に、Ansi警告を無効にしてください。

SET ANSI_WARNINGS OFF

10文字の長さの場合、データ切り捨てられることに注意してください。

編集

実際に列の長さを変更する前に、既存の長さを確認してください。

SET ANSI_WARNINGS OFF
GO

CREATE TABLE Test (Value CHAR(10))
INSERT INTO Test SELECT ('1234567890')

IF NOT EXISTS (SELECT * FROM Test WHERE LEN(Value) > 9)
  ALTER TABLE Test ALTER COLUMN Value CHAR(9)
ELSE
  SELECT LEN(Value), * FROM Test WHERE LEN(Value) > 9

DROP TABLE Test
于 2010-06-16T14:18:22.517 に答える
0

変更しようとしたテーブルに履歴テーブルがアタッチされていたため、上記の2つの回答は機能しませんでした。これは私がしたことです:

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)
ALTER TABLE MY_TABLE SET (SYSTEM_VERSIONING = OFF)
-- Might need to UPDATE MY_TABLEHistory SET MY_COLUMN = LEFT(MY_COLUMN, 9)
-- I didn't
ALTER TABLE MY_TABLEHistory ALTER COLUMN [MY_COLUMN] [varchar] (9) NULL
ALTER TABLE MY_TABLE SET (SYSTEM_VERSIONING = ON(HISTORY_TABLE = MY_TABLEHistory))
ALTER TABLE MY_TABLE ALTER COLUMN [MY_COLUMN] [varchar] (9) NULL
于 2018-10-24T21:00:07.757 に答える