Alterar coluna, adicionar restrição padrão

187

Eu tenho uma tabela e uma das colunas é "Data" do tipo datetime. Decidimos adicionar uma restrição padrão a essa coluna

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

mas isso me dá erro:

Sintaxe incorreta perto de '.'

Alguém vê algo obviamente errado aqui, o que me falta (além de ter um nome melhor para a coluna)

RAM
fonte
11
Não use tipos ou palavras-chave como nomes de colunas!
Jonh
8
Sim, concordei - "Alguém vê algo obviamente errado aqui, do que estou perdendo (além de ter um nome melhor para a coluna)"
ram

Respostas:

349

Tente isto

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

exemplo

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

também certifique-se de nomear a restrição padrão .. será uma dor de cabeça para eliminá-la mais tarde, pois terá um desses nomes malucos gerados pelo sistema ... consulte também Como nomear restrições padrão e como eliminar restrições padrão sem Um nome no SQL Server

SQLMenace
fonte
7

você pode colocar palavras reservadas entre colchetes para evitar esses tipos de erros:

dbo.TableName.[Date]
Raio
fonte
1
Parece uma péssima idéia usar palavras reservadas para nomes de colunas.
Norbert Norbertson
4
Parece, mas não é. Eu usá-los com sucesso desde 2004 :)
Cătălin Rădoi
7

Eu uso o procedimento armazenado abaixo para atualizar os padrões em uma coluna.

Ele remove automaticamente os padrões anteriores da coluna, antes de adicionar o novo padrão.

Exemplos de uso:

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

Procedimento armazenado:

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

Erros que este procedimento armazenado elimina

Se você tentar adicionar um padrão a uma coluna quando uma já existir, você receberá o seguinte erro (algo que você nunca verá se usar este procedimento armazenado):

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

Na verdade, você deve fazer o exemplo abaixo, o que ajudará a resolver o 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
Ajit Kumar KV
fonte
Isso é usado apenas para a prática, não pode ser usado na realidade #
315 Long
0

Você está especificando o nome da tabela duas vezes. A parte ALTER TABLE nomeia a tabela. Tente: Altere a tabela TableName altere a coluna [Date] default getutcdate ()

Kelvin Lush
fonte
0

alterar tabela restrição de descarte de TableName DF_TableName_WhenEntered

alterar tabela TableName adicionar restrição DF_TableName_WhenEntered getutcdate () padrão para WhenEntered

Abhijit Poojari
fonte
esta resposta também contém a consulta de restrição de descarte. ele pode obter ajuda com esta resposta. @RalfFriedl
Abhijit Poojari