Sütunu değiştir, varsayılan kısıtlama ekle


187

Bir tablo var ve sütunlardan biri datetime türü "Tarih". Bu sütuna varsayılan bir kısıtlama eklemeye karar verdik

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

ama bu bana hata veriyor:

Yanlış sözdizimi yanında '.'

Burada eksik olduğum kimse yanlış bir şey görüyor mu (sütun için daha iyi bir isim olması dışında)


11
Sütun adları olarak türleri veya anahtar kelimeleri kullanmayın!
JonH

8
yup, katılıyorum- "Herkes burada açıkça eksik bir şey görüyor, ki ben hangi eksik (sütun için daha iyi bir isim olması dışında)"
ram

Yanıtlar:


349

Bunu dene

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

misal

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

Ayrıca varsayılan kısıtlamayı adlandırdığınızdan emin olun ... daha sonra düşürmek için boyunda bir ağrı olacaktır, çünkü bu çılgın sistem tarafından üretilen adlardan birine sahip olacaktır ... Ayrıca bkz. Varsayılan Kısıtlamalar Nasıl Adlandırılır ve SQL Server'da Bir Ad


7

bu tür hataları önlemek için ayrılmış kelimeleri köşeli parantez içine alabilirsiniz:

dbo.TableName.[Date]

1
Sütun adları için ayrılmış kelimeler kullanmak gerçekten kötü bir fikir gibi görünüyor.
Norbert Norbertson

4
Öyle görünüyor, ama değil. Onları 2004'ten beri başarıyla kullanıyorum :)
Cătălin Rădoi

7

Bir sütundaki varsayılanları güncellemek için aşağıdaki saklı yordamı kullanın.

Yeni varsayılanı eklemeden önce sütundaki önceki varsayılanları otomatik olarak kaldırır.

Kullanım örnekleri:

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

Saklı yordam:

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

Bu saklı yordamın giderdiği hatalar

Bir sütun zaten mevcut olduğunda bir sütuna varsayılan değer eklemeye çalışırsanız, aşağıdaki hatayı alırsınız (bu saklı işlemi kullandığınızda asla göremeyeceğiniz bir şey):

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

Aslında Sorunun Çözülmesine Yardımcı Olacak Aşağıda Aşağıdaki gibi Yapmanız gerekir ...

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

Bu sadece pratik için kullanın, gerçekte kullanamazsınız
Trương Long

0

Tablo adını iki kez belirtiyorsunuz. ALTER TABLE bölümü tabloyu adlandırır. Deneyin: Tablo değiştirme TabloAdı değiştirme sütunu [Tarih] varsayılan getutcdate ()


0

tablo değiştirme TabloAdı bırakma kısıtlaması DF_TableName_WhenEntered

tablo değiştirme TabloAdı Add kısıtlaması ekle DF_TableName_WhenEntered WhenEntered için varsayılan getutcdate ()


bu cevap düşme kısıtlama sorgusunu da içerir. eğer birisi daha önce getdate () eklemişse ve şimdi getutcdate () için değiştirmesi gerekir. bu cevaptan biraz yardım alabilir. @RalfFriedl
Abhijit Poojari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.