2014-09-12 28 views
15

wiem, można zmienić domyślną wartość istniejącej kolumny jak this:zmień wartość domyślna kolumna

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn; 

Ale według this moje zapytanie ma działać:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL 
     CONSTRAINT DF_Constraint DEFAULT GetDate() 

Więc ja” m próbuje ustawić moją kolumnę Not Null, a także ustawić wartość Default. Ale uzyskanie Incoorect Błąd składni w pobliżu CONSTRAINT. Czy brakuje mi czegoś?

+0

Myślę, że potrzebujesz "ADD CONSTRAINT", jak w twoim pierwszym przykładzie. – Andrew

Odpowiedz

9

myślę kwestią jest tu z pomylenia Create Table i Alter Table poleceń. Jeśli spojrzymy na Create table wtedy możemy dodać wartość domyślną i domyślne ograniczenie w tym samym czasie jak:

<column_definition> ::= 
column_name <data_type> 
    [ FILESTREAM ] 
    [ COLLATE collation_name ] 
    [ SPARSE ] 
    [ NULL | NOT NULL ] 
    [ 
     [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
     | [ IDENTITY [ (seed,increment) ] [ NOT FOR REPLICATION ] 
    ] 
    [ ROWGUIDCOL ] 
    [ <column_constraint> [ ...n ] ] 
    [ <column_index> ] 
ex: 
CREATE TABLE dbo.Employee 
(
    CreateDate datetime NOT NULL 
    CONSTRAINT DF_Constraint DEFAULT (getdate()) 
) 
ON PRIMARY; 

można sprawdzić kompletnej definicji tutaj: http://msdn.microsoft.com/en-IN/library/ms174979.aspx

ale jeśli spojrzymy na definicji Alter Table następnie ALTER TABLE ALTER COLUMN nie można dodawać CONSTRAINT opcje dostępne dla ADD są:

| ADD 
    { 
     <column_definition> 
     | <computed_column_definition> 
     | <table_constraint> 
     | <column_set_definition> 
    } [ ,...n ] 

Sprawdź tutaj: http://msdn.microsoft.com/en-in/library/ms190273.aspx

Więc trzeba będzie napisać dwa różne oświadczenia jeden do zmiany kolumny jak:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL; 

a drugi do zmiany tabeli i dodać domyślny ograniczenie

ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;

Mam nadzieję, że to pomoże !!!

+0

od razu na miejscu. jeśli rozumiem to poprawnie, Microsoft musi zaktualizować ich zawartość: http://msdn.microsoft.com/en-us/library/ms187742%28v=sql.110%29.aspx – SZT

+0

no .. jeśli czytasz pierwszy wiersz poprawnie następnie 'Określa właściwości kolumny, która ** dodaje ** do tabeli przy użyciu ALTER TABLE. Więc zawsze możesz napisać coś: 'ALTER TABLE ** ADD ** COLUMN .. CONSTRAINT .. DEFAULT; ' – Deepshikha

+0

wow r ponownie :) Mikrosoft musi umieścić te gwiazdki wokół" dodane "haha – SZT

5

Dla zmiany istniejącej kolumny trzeba:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL; 
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
1

Od MSDN ALTER TABLE przykładów:

D. Dodawanie ograniczenie DEFAULT do istniejącej kolumny

Poniższy przykład tworzy tabelę z dwiema kolumnami i wstawia wartość do pierwszej kolumny, a druga kolumna pozostaje NULL. Ograniczenie DEFAULT jest następnie dodawane do drugiej kolumny. Aby sprawdzić, czy wartość domyślna jest zastosowana, do pierwszej kolumny zostanie wstawiona inna wartość, a tabela zostanie przeszukiwana.

CREATE TABLE dbo.doc_exz (column_a INT, column_b INT) ; 
GO 
INSERT INTO dbo.doc_exz (column_a)VALUES (7) ; 
GO 
ALTER TABLE dbo.doc_exz 
ADD CONSTRAINT col_b_def 
DEFAULT 50 FOR column_b ; 
GO 
INSERT INTO dbo.doc_exz (column_a) VALUES (10) ; 
GO 
SELECT * FROM dbo.doc_exz ; 
GO 
DROP TABLE dbo.doc_exz ; 
GO 

Tak w skrócie, potrzebne są ADD CONSTRAINT

ALTER TABLE MyTable 
    ALTER COLUMN CreateDate DATETIME NOT NULL ; 

ALTER TABLE MyTable 
    ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
2

To powinno być -

ALTER TABLE MyTable 
ALTER COLUMN CreateDate DATETIME NOT NULL; 

ALTER TABLE MyTable 
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
4

Nie ma bezpośredni sposób zmienić domyślną wartość kolumny w serwerze SQL, ale następujący parametryzowane skrypt wykona tę pracę:

DECLARE @table nvarchar(100) 
DECLARE @column nvarchar(100) 
DECLARE @newDefault nvarchar(100) 
SET @table='TableName' 
SET @column='ColumnName' 
SET @newDefault='0' 

IF EXISTS (select name from sys.default_constraints 
    where parent_object_id = object_id(@table) 
    and parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId')) 
BEGIN 
    DECLARE @constraintName as nvarchar(200) 
    DECLARE @constraintQuery as nvarchar(2000) 

    SELECT @constraintName = name from sys.default_constraints 
     where parent_object_id = object_id(@table) and parent_column_id = columnproperty(object_id(@table),@column, 'ColumnId') 

    SET @constraintQuery = 'ALTER TABLE '[email protected]+' DROP CONSTRAINT '[email protected]constraintName +'; ALTER TABLE '+ @table 
     + ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '[email protected]+' FOR '[email protected] 

    EXECUTE sp_executesql @constraintQuery 
END 

Wystarczy wypełnić parametry i wykonać. Skrypt usuwa istniejące ograniczenie i tworzy nowy o określonej wartości domyślnej.

+0

To jest najlepsza odpowiedź dla wszystkich pytań związanych z" jak zmienić kolumnę domyślna wartość'? Bierze pod uwagę, że istnieje istniejąca wartość domyślna, a ta wartość domyślna może mieć nazwę wygenerowaną przez system, i może być skryptowana i nie polega na ręcznej obserwacji/manipulacji. – mickeyf