Zmień kolumnę, dodaj domyślne ograniczenie

187

Mam tabelę, a jedną z kolumn jest „Data” typu datetime. Zdecydowaliśmy się dodać domyślne ograniczenie do tej kolumny

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

ale to daje mi błąd:

Niepoprawna składnia w pobliżu '.'

Czy ktoś widzi tutaj coś oczywiście niewłaściwego, czego mi brakuje (oprócz tego, że mam lepszą nazwę kolumny)

Baran
źródło
11
Nie używaj typów ani słów kluczowych jako nazw kolumn!
JonH
8
tak, zgodziłem się - „Czy ktoś widzi tutaj coś oczywiście złego, czego mi brakuje (oprócz tego, że mam lepszą nazwę dla kolumny)”
ram

Odpowiedzi:

349

Spróbuj tego

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

przykład

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

upewnij się również, że nazwa domyślnego ograniczenia..Będzie to kark, aby upuścić go później, ponieważ będzie miał jedną z tych zwariowanych nazw generowanych przez system ... zobacz także Jak nazwać domyślne ograniczenia i jak usunąć domyślne ograniczenie bez Nazwa w SQL Server

SQLMenace
źródło
7

możesz zawijać słowa zastrzeżone w nawiasach kwadratowych, aby uniknąć tego rodzaju błędów:

dbo.TableName.[Date]
Promień
źródło
1
Wydaje się, że używanie słów zastrzeżonych do nazw kolumn jest naprawdę złym pomysłem.
Norbert Norbertson
4
Wydaje się, ale tak nie jest. Używam ich z powodzeniem od 2004 roku :)
Cătălin Rădoi
7

Korzystam z procedury przechowywanej poniżej, aby zaktualizować wartości domyślne w kolumnie.

Automatycznie usuwa wszelkie wcześniejsze wartości domyślne w kolumnie, przed dodaniem nowej wartości domyślnej.

Przykłady użycia:

-- 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 składowana:

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

Błędy, które ta procedura przechowywana eliminuje

Jeśli spróbujesz dodać wartość domyślną do kolumny, gdy już istnieje, pojawi się następujący błąd (coś, czego nigdy nie zobaczysz, jeśli używasz tego przechowywanego proc):

-- 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
źródło
5

W rzeczywistości musisz zrobić jak poniżej przykład, który pomoże rozwiązać problem ...

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
źródło
Tego po prostu używaj do ćwiczeń, nie można go używać w rzeczywistości
Trương Long
0

Podajesz nazwę tabeli dwa razy. Część ALTER TABLE nazywa tabelę. Wypróbuj: Zmień tabelę Nazwa tabeli Zmień kolumnę [Data] domyślna getutcdate ()

Kelvin Lush
źródło
0

alter table Ograniczenie upuszczania TableName DF_TableName_WhenEntered

zmiana tabeli nazwa_tabeli dodaj ograniczenie DF_TableName_WhenEntered domyślna getutcdate () dla WhenEntered

Abhijit Poojari
źródło
ta odpowiedź zawiera również zapytanie o ograniczenie upuszczania. jeśli ktoś wcześniej dodał getdate () i teraz musi go zmienić na getutcdate (). może uzyskać pomoc dzięki tej odpowiedzi. @RalfFriedl
Abhijit Poojari