Spalte ändern, Standardeinschränkung hinzufügen


185

Ich habe eine Tabelle und eine der Spalten ist "Datum" vom Typ datetime. Wir haben beschlossen, dieser Spalte eine Standardeinschränkung hinzuzufügen

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

aber das gibt mir Fehler:

Falsche Syntax in der Nähe '.'

Hat hier jemand offensichtlich etwas falsches gesehen, was mir fehlt (außer einen besseren Namen für die Spalte zu haben)?


11
Verwenden Sie keine Typen oder Schlüsselwörter als Spaltennamen!
JonH

8
yup, stimmte zu- "Sieht hier jemand etwas offensichtlich Falsches, was mir fehlt (außer einen besseren Namen für die Kolumne zu haben)"
ram

Antworten:


349

Versuche dies

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

Beispiel

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

Stellen Sie außerdem sicher, dass Sie die Standardeinschränkung benennen. Es wird Ihnen schwer fallen, sie später fallen zu lassen, da sie einen dieser verrückten systemgenerierten Namen enthält. Siehe auch So benennen Sie Standardbeschränkungen und So lassen Sie Standardbeschränkungen ohne fallen Ein Name in SQL Server


7

Sie können reservierte Wörter in eckige Klammern setzen, um folgende Fehler zu vermeiden:

dbo.TableName.[Date]

1
Es scheint eine wirklich schlechte Idee zu sein, reservierte Wörter für Spaltennamen zu verwenden.
Norbert Norbertson

4
Es scheint, aber es ist nicht. Ich benutze sie erfolgreich seit 2004 :)
Cătălin Rădoi

7

Ich verwende die unten gespeicherte Prozedur, um die Standardeinstellungen für eine Spalte zu aktualisieren.

Vor dem Hinzufügen des neuen Standards werden automatisch alle vorherigen Standardeinstellungen in der Spalte entfernt.

Anwendungsbeispiele:

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

Gespeicherte Prozedur:

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

Fehler, die diese gespeicherte Prozedur beseitigt

Wenn Sie versuchen, einer Spalte einen Standard hinzuzufügen, wenn bereits eine vorhanden ist, wird der folgende Fehler angezeigt (etwas, das Sie bei Verwendung dieses gespeicherten Prozesses nie sehen werden):

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

Eigentlich müssen Sie wie im folgenden Beispiel vorgehen, um das Problem zu lösen ...

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

Diese nur zum Üben verwenden, kann in der Realität nicht verwendet werden
Trương Long

0

Sie geben den Tabellennamen zweimal an. Der Teil ALTER TABLE benennt die Tabelle. Versuchen Sie: Tabelle ändern Tabellenname Spalte ändern [Datum] default getutcdate ()


0

Tabelle ändern Tabellenname Drop-Einschränkung DF_TableName_WhenEntered

Tabelle ändern Tabellenname Einschränkung hinzufügen DF_TableName_WhenEntered Standard getutcdate () für WhenEntered


Diese Antwort enthält auch die Abfrage für die Drop-Einschränkung. Wenn jemand getdate () früher hinzugefügt hat und diese jetzt in getutcdate () ändern muss. er könnte durch diese Antwort Hilfe bekommen. @ RalfFriedl
Abhijit Poojari
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.