this のような既存の列のデフォルト値を変更できることを知っています。
ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
しかし、 this によると、私のクエリは動作するはずです:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL
CONSTRAINT DF_Constraint DEFAULT GetDate()
したがって、ここでは、列を非ヌルにし、デフォルト値を設定しようとしています。しかし、CONSTRAINTの近くでIncoorect構文エラーが発生します。 sthがありませんか?
ここでの問題は、Create Table
コマンドとAlter Table
コマンドの混乱にあると思います。 Create table
を見ると、デフォルト値とデフォルト制約を同時に追加できます:
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ]
[ <column_constraint> [ ...n ] ]
[ <column_index> ]
ex:
CREATE TABLE dbo.Employee
(
CreateDate datetime NOT NULL
CONSTRAINT DF_Constraint DEFAULT (getdate())
)
ON PRIMARY;
ここで完全な定義を確認できます: http://msdn.Microsoft.com/en-IN/library/ms174979.aspx
しかし、Alter Table
の定義を見ると、ALTER TABLE ALTER COLUMN
でCONSTRAINT
を追加することはできませんADD
で使用できるオプションは次のとおりです。
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
ここで確認してください: http://msdn.Microsoft.com/en-in/library/ms190273.aspx
したがって、列を変更するための2つの異なるステートメントを次のように記述する必要があります。
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
およびテーブルを変更し、デフォルトの制約を追加するための別の
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
お役に立てれば!!!
SQLサーバーの列のデフォルト値を直接変更する方法はありませんが、次のパラメーター化されたスクリプトが機能します。
DECLARE @table nvarchar(100)
DECLARE @column nvarchar(100)
DECLARE @newDefault nvarchar(100)
SET @table='TableName'
SET @column='ColumnName'
SET @newDefault='0'
IF EXISTS (select name from sys.default_constraints
where parent_object_id = object_id(@table)
and parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId'))
BEGIN
DECLARE @constraintName as nvarchar(200)
DECLARE @constraintQuery as nvarchar(2000)
SELECT @constraintName = name from sys.default_constraints
where parent_object_id = object_id(@table) and parent_column_id = columnproperty(object_id(@table),@column, 'ColumnId')
SET @constraintQuery = 'ALTER TABLE '+@table+' DROP CONSTRAINT '+@constraintName +'; ALTER TABLE '+ @table
+ ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '+@newDefault+' FOR '+@column
EXECUTE sp_executesql @constraintQuery
END
パラメータを入力して実行するだけです。スクリプトは既存の制約を削除し、指定されたデフォルト値で新しい制約を作成します。
既存の列を変更するには、以下を行う必要があります。
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
そのはず -
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
MSDNから ALTER TABLE の例:
D。既存の列にDEFAULT制約を追加する
次の例では、2つの列を持つテーブルを作成し、最初の列に値を挿入します。他の列は[〜#〜] null [〜#〜]のままです。 [〜#〜] default [〜#〜]制約が2番目の列に追加されます。デフォルトが適用されていることを確認するために、別の値が最初の列に挿入され、テーブルが照会されます。
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO
つまり、要するに、ADD CONSTRAINT
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL ;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;