列を変更し、デフォルトの制約を追加


187

テーブルがあり、列の1つは、datetimeタイプの「日付」です。その列にデフォルトの制約を追加することにしました

Alter table TableName
alter column dbo.TableName.Date default getutcdate() 

しかし、これは私にエラーを与えます:

「。」付近の構文が正しくありません

誰かがここで明らかに間違っている何かを見ていますか?それは私が見逃しています(カラムのより良い名前を除いて)


11
タイプやキーワードを列名として使用しないでください!
JonH

8
うん、同意しました-「ここで明らかに間違っている何かを見かけますか?(コラムのより良い名前以外)」
ram

回答:


349

これを試して

alter table TableName 
 add constraint df_ConstraintNAme 
 default getutcdate() for [Date]

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

また、デフォルトの制約に名前を付けることも忘れないでください。クレイジーなシステムで生成された名前の1つになるため、後でそれを削除するのは大変です。デフォルトの制約に名前を付ける方法とデフォルトの制約を削除する方法も参照してくださいSQL Serverの名前


7

予約語を角かっこで囲むと、次のようなエラーを回避できます。

dbo.TableName.[Date]

1
列名に予約語を使用するのは本当に悪い考えのようです。
Norbert Norbertson 2017

4
あるようですが、そうではありません。私は2004年以来、正常にそれらを使用する:)
カタリンRădoi

7

以下のストアドプロシージャを使用して、列のデフォルトを更新します。

新しいデフォルトを追加する前に、列の以前のデフォルトが自動的に削除されます。

使用例:

-- Update default to be a date.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','getdate()';
-- Update default to be a number.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
-- Update default to be a string. Note extra quotes, as this is not a function.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';

ストアドプロシージャ:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- Sample function calls:
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','ColumnName','getdate()';
--exec [dbol].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';
create PROCEDURE [dbo].[ColumnDefaultUpdate]
    (
        -- Table name, including schema, e.g. '[dbo].[TableName]'
        @TABLE_NAME VARCHAR(100), 
        -- Column name, e.g. 'ColumnName'.
        @COLUMN_NAME VARCHAR(100),
        -- New default, e.g. '''MyDefault''' or 'getdate()'
        -- Note that if you want to set it to a string constant, the contents
        -- must be surrounded by extra quotes, e.g. '''MyConstant''' not 'MyConstant'
        @NEW_DEFAULT VARCHAR(100)
    )
AS 
BEGIN       
    -- Trim angle brackets so things work even if they are included.
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, '[', '')
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, ']', '')

    print 'Table name: ' + @TABLE_NAME;
    print 'Column name: ' + @COLUMN_NAME;
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID(@TABLE_NAME) AND [name] = @COLUMN_NAME;

    IF @ObjectName <> '' 
    begin
        print 'Removed default: ' + @ObjectName;
        --print('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
        EXEC('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
    end

    EXEC('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    --print('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    print 'Added default of: ' + @NEW_DEFAULT;
END

このストアドプロシージャが排除するエラー

列がすでに存在しているときにデフォルトを列に追加しようとすると、次のエラーが発生します(このストアドプロシージャを使用している場合は表示されません)。

-- Using the stored procedure eliminates this error:
Msg 1781, Level 16, State 1, Line 1
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

5

実際には、問題を解決するのに役立つ以下の例のように行う必要があります...

drop table ABC_table

create table ABC_table
(
    names varchar(20),
    age int
)

ALTER TABLE ABC_table
ADD CONSTRAINT MyConstraintName
DEFAULT 'This is not NULL' FOR names

insert into ABC(age) values(10)

select * from ABC

これは練習用であり、実際には使用できません
Tr –ng Long

0

テーブル名を2回指定しています。ALTER TABLEパーツはテーブルに名前を付けます。試してみてください:テーブル名の変更テーブル名の変更列[日付]デフォルトのgetutcdate()


0

変更テーブルTableNameドロップ制約DF_TableName_WhenEntered

Alter Table TableName add constraint DF_TableName_WhenEntered default getutcdate()for WhenEntered


この回答にはドロップ制約クエリも含まれています。誰かが以前にgetdate()を追加していて、今度はgetutcdate()に変更する必要がある場合。彼はこの答えを通していくつかの助けを得るかもしれません。@RalfFriedl
Abhijit Poojari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.