テーブルの変更:「Nullを許可」属性をnull以外からnullを許可するように変更する方法


207

T-SQLを使用してテーブルの1つの属性を変更してnullを許可する方法(nullではない-> null)多分テーブルを変えますか?


12
SQL Server Management Studioは、このような単純なタスクのために非常に複雑なスクリプトを作成します。それが私が混乱してスタックオーバーフローをチェックした理由です。多分それが問題のポイントです...
Tillito

回答:


363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL

4
または、ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)明示的に別段の指定がない限り、デフォルトでnullを許可するように。
マーティン・スミス

3
nullを許可するために複数の列を変更する必要がある場合は、個別のALTER TABLE .. ALTER COLUMN ..コマンドを実行する必要があることに注意してください
sonyisda1

2
これが機能しないいくつかのケースがあることに注意してください- もしあなたが得るなら、このDBA Stack Exchangeの答えを見てくださいALTER TABLE ALTER COLUMN failed because one or more objects access this column.
ジャロッド・ディクソン

49

はいALTER TABLE、次のように使用できます。

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

ALTER TABLEドキュメントからの引用:

NULLPRIMARY KEY制約の列を除き、列ALTER COLUMNを強制的にNOT NULLnull値を許可するように指定できます。


22

ALTER TABLEは正しい:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
制約を再定義し、データ型のみを定義する必要がありますか?MSDNの記事では、制約を再定義する必要があることについては触れられていません。「ALTER COLUMNでNULLまたはNOT NULLを指定する場合は、new_data_type [(precision [、scale])]も指定する必要があります。スケールは変更されません。現在の列の値を指定してください。」
Daniel Vassallo、

@ダニエルヴァッサロ-あなたは正しいです。完全なものにしようとしましたが、NULL / NOT NULLの変更のみが変更されます。
2010年


4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

2
@ÁronLőrincz問題はPostgresについてではありません。SQL Serverのタグが付いているため、この答えは正しくありません。
マーティンスミス

あなたは正しいですが、それでも私には役立ったので、Google経由で質問を見つけた人に役立つコメントだと思います。質問のタイトルでは、それがどのデータベースサーバーであるかが明確にされていません。
Aron Lorincz 2016

1

これを書いて、すべてのテーブルと列を一度にnullに編集できるようにしました。

select 
case
when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
when st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
else
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
end as query
from sys.columns sc
inner join sys.types st on st.system_type_id = sc.system_type_id
inner join sys.objects so on so.object_id = sc.object_id
where so.type = 'U'
and st.name <> 'timestamp'
order by st.name

1

これはこれを行うためのアプローチです:-

  1. テーブルまたは列が存在するかどうかを確認してください。
  2. はいの場合、列を変更します。例えば:-
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
            TABLE_CATALOG = 'DBName' AND 
            TABLE_SCHEMA = 'SchemaName' AND
            TABLE_NAME = 'TableName' AND
            COLUMN_NAME = 'ColumnName')
BEGIN
    ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
END  

あなたが任意のスキーマを持っていない場合は、削除し、デフォルトのスキーマを与える必要がないため、スキーマラインを。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.