web-dev-qa-db-ja.com

デフォルト値で列のデータ型を変更する方法

SQLServerの列のデータ型をtinyintからsmallintに変更しようとしています。

しかし、私の列にはデフォルト値があり、制約の名前がわかりません。

それを行う簡単な方法はありますか?

これはデフォルトの制約のために機能しません:

ALTER TABLE mytable
Alter Column myColumn smallint NOT NULL default 1
11
GregM

これは、いくつかの手順で行う必要があります。最初に、列にデフォルトの制約を削除してから、列を変更します。

次のようなコードを使用できます。

-- find out the name of your default constraint - 
-- assuming this is the only default constraint on your table
DECLARE @defaultconstraint sysname

SELECT @defaultconstraint = NAME 
FROM sys.default_constraints 
WHERE parent_object_id = object_ID('dbo.mytable')

-- declare a "DROP" statement to drop that default constraint
DECLARE @DropStmt NVARCHAR(500)

SET @DropStmt = 'ALTER TABLE dbo.mytable DROP CONSTRAINT ' + @defaultconstraint

-- drop the constraint
EXEC(@DropStmt)

-- alternatively: if you *know* the name of the default constraint - you can do this
-- more easily just by executing this single line of T-SQL code:

-- ALTER TABLE dbo.mytable DROP CONSTRAINT (fill in name of constraint here)

-- modify the column's datatype        
ALTER TABLE dbo.mytable
Alter Column myColumn smallint NOT NULL 

-- re-apply a default constraint - hint: give it a sensible name!
ALTER TABLE dbo.mytable
ADD CONSTRAINT DF_mytable_myColumn DEFAULT 1 FOR MyColumn
23
marc_s

あなたは3つのステップのプロセスとしてそれを行うことができます

  • 別の名前で新しい列を追加し、
  • 古い列から新しい列に値をコピーします
  • 古い列を削除します

名前が同じであることが重要です。その後、プロセスを繰り返して名前を元に戻します。

2
Matt T

MS Management Studioを使用して、デフォルトの制約名を見つけることができます。指定されたDBのtablesフォルダーを見つけて、[制約]を確認します。制約が多数ある場合は、「制約をクエリウィンドウにスクリプト化して、関連する列名を表示することができます。

0
ron tornambe