Modifica colonna, aggiungi vincolo predefinito


187

Ho una tabella e una delle colonne è "Data" di tipo datetime. Abbiamo deciso di aggiungere un vincolo predefinito a quella colonna

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

ma questo mi dà un errore:

Sintassi errata vicino a "."

Qualcuno vede qualcosa di ovviamente sbagliato qui, che mi manca (diverso da avere un nome migliore per la colonna)


11
Non usare tipi o parole chiave come nomi di colonna!
JonH

8
sì, d'accordo- "Qualcuno vede qualcosa di ovviamente sbagliato qui, che mi manca (oltre ad avere un nome migliore per la colonna)"
ram

Risposte:


349

Prova questo

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

esempio

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

assicurati anche di nominare il vincolo predefinito ... sarà una seccatura rilasciarlo in seguito perché avrà uno di quei pazzi nomi generati dal sistema ... vedi anche Come nominare i vincoli predefiniti e come eliminare i vincoli predefiniti senza Un nome in SQL Server


7

puoi racchiudere le parole riservate tra parentesi quadre per evitare questo tipo di errori:

dbo.TableName.[Date]

1
Sembra una pessima idea usare parole riservate per i nomi delle colonne.
Norbert Norbertson,

4
Sembra, ma non lo è. Li uso con successo dal 2004 :)
Cătălin Rădoi

7

Uso la procedura memorizzata di seguito per aggiornare i valori predefiniti su una colonna.

Rimuove automaticamente tutti i valori predefiniti precedenti nella colonna, prima di aggiungere il nuovo valore predefinito.

Esempi di utilizzo:

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

Procedura memorizzata:

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

Errori eliminati da questa procedura memorizzata

Se si tenta di aggiungere un valore predefinito a una colonna quando ne esiste già una, verrà visualizzato il seguente errore (qualcosa che non si vedrà mai se si utilizza questo proc memorizzato):

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

In realtà devi fare come sotto l'esempio, che ti aiuterà a risolvere il problema ...

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

Questo solo per la pratica, non può essere utilizzato nella realtà
Trương Long,

0

Stai specificando il nome della tabella due volte. La parte ALTER TABLE nomina la tabella. Prova: modifica tabella TableName alter colonna [Data] default getutcdate ()


0

modifica tabella Vincolo di rilascio TableName DF_TableName_WhenEntered

alter table TableName aggiungi vincolo DF_TableName_WhenEntered getutcdate predefinito () per WhenEntered


questa risposta contiene anche la query del vincolo di rilascio. Se qualcuno aveva aggiunto getdate () in precedenza e ora deve modificarlo per getutcdate (). potrebbe ricevere aiuto attraverso questa risposta. @RalfFriedl
Abhijit Poojari il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.