Ubah kolom, tambahkan batasan default

187

Saya punya tabel dan salah satu kolom adalah "Tanggal" tipe datetime. Kami memutuskan untuk menambahkan batasan default ke kolom itu

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

tapi ini memberi saya kesalahan:

Sintaksis salah dekat '.'

Adakah yang melihat ada yang salah di sini, yang saya lewatkan (selain memiliki nama yang lebih baik untuk kolom)

ram
sumber
11
Jangan gunakan jenis atau kata kunci sebagai nama kolom!
JonH
8
yup, setuju - "Apakah ada yang melihat sesuatu yang jelas salah di sini, yang saya lewatkan (selain memiliki nama yang lebih baik untuk kolom)"
ram

Jawaban:

349

Coba ini

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

contoh

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

juga pastikan Anda memberi nama batasan default..itu akan menjadi sakit di leher untuk menjatuhkannya nanti karena akan memiliki salah satu dari nama-nama sistem gila yang dihasilkan ... lihat juga Cara Mengenal Kendala Default Dan Cara Mengurangi Kendala Default Tanpa Nama dalam SQL Server

SQLMenace
sumber
7

Anda dapat membungkus kata-kata yang dipesan dalam tanda kurung siku untuk menghindari kesalahan seperti ini:

dbo.TableName.[Date]
sinar
sumber
1
Sepertinya ide yang sangat buruk untuk menggunakan kata-kata yang dicadangkan untuk nama kolom.
Norbert Norbertson
4
Sepertinya, tapi tidak. Saya berhasil menggunakannya sejak 2004 :)
Cătălin Rădoi
7

Saya menggunakan prosedur tersimpan di bawah ini untuk memperbarui default pada kolom.

Secara otomatis menghapus default sebelumnya pada kolom, sebelum menambahkan default baru.

Contoh penggunaan:

-- 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''';

Prosedur tersimpan:

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

Kesalahan prosedur tersimpan ini menghilangkan

Jika Anda mencoba untuk menambahkan default ke kolom ketika sudah ada, Anda akan mendapatkan kesalahan berikut (sesuatu yang Anda tidak akan pernah lihat jika menggunakan proc yang disimpan ini):

-- 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.
Contango
sumber
5

Sebenarnya Anda harus Melakukan Seperti contoh di bawah ini, yang akan membantu untuk Memecahkan Masalah ...

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
Ajit Kumar KV
sumber
Ini hanya digunakan untuk latihan, tidak bisa digunakan dalam kenyataan
Trương Long
0

Anda menetapkan nama tabel dua kali. Bagian ALTER TABLE menamai tabel tersebut. Coba: Ubah tabel TableName mengubah kolom [Tanggal] default getutcdate ()

Kelvin Lush
sumber
0

mengubah tabel TableName drop constraint DF_TableName_WhenEntered

ubah tabel TableName tambahkan kendala DF_TableName_WhenEntered default getutcdate () untuk WhenEntered

Abhijit Poojari
sumber
jawaban ini berisi permintaan batasan drop juga. Jika seseorang telah menambahkan getdate () sebelumnya dan sekarang dia perlu mengubahnya untuk getutcdate (). dia mungkin mendapat bantuan melalui jawaban ini. @RalfFriedl
Abhijit Poojari