Alterar columna, agregar restricción predeterminada

187

Tengo una tabla y una de las columnas es "Fecha" de tipo datetime. Decidimos agregar una restricción predeterminada a esa columna

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

pero esto me da un error:

Sintaxis incorrecta cerca '.'

¿Alguien ve algo obviamente mal aquí, que me falta (aparte de tener un mejor nombre para la columna)

RAM
fuente
11
¡No use tipos o palabras clave como nombres de columna!
JonH
8
sí, de acuerdo: "¿Alguien ve algo obviamente mal aquí, que me estoy perdiendo (aparte de tener un mejor nombre para la columna)"
ram

Respuestas:

349

Prueba esto

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

ejemplo

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

también asegúrese de nombrar la restricción predeterminada ... será un dolor en el cuello soltarla más tarde porque tendrá uno de esos nombres locos generados por el sistema ... vea también Cómo nombrar las restricciones predeterminadas y cómo soltar la restricción predeterminada sin Un nombre en SQL Server

SQLMenace
fuente
7

Puede ajustar las palabras reservadas entre corchetes para evitar este tipo de errores:

dbo.TableName.[Date]
Rayo
fuente
1
Parece una muy mala idea usar palabras reservadas para los nombres de columna.
Norbert Norbertson
44
Parece, pero no lo es. Los uso con éxito desde 2004 :)
Cătălin Rădoi
7

Utilizo el procedimiento almacenado a continuación para actualizar los valores predeterminados en una columna.

Elimina automáticamente cualquier valor predeterminado anterior en la columna, antes de agregar el nuevo valor predeterminado.

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

Procedimiento almacenado:

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

Errores que este procedimiento almacenado elimina

Si intenta agregar un valor predeterminado a una columna cuando ya existe una, obtendrá el siguiente error (algo que nunca verá si usa este proceso almacenado):

-- 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.
Aplazamiento de pago
fuente
5

En realidad, debe hacer lo siguiente en el ejemplo, que ayudará a resolver el 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
fuente
Esto solo se usa para practicar, no se puede usar en realidad
Trương Long
0

Estás especificando el nombre de la tabla dos veces. La parte ALTER TABLE nombra la tabla. Intente: Alterar tabla TableName alterar columna [Fecha] getutcdate predeterminado ()

Kelvin Lush
fuente
0

Alterar tabla TableName Restricción de caída DF_TableName_WhenEntered

alter table TableName agregar restricción DF_TableName_WhenEntered default getutcdate () para WhenEntered

Abhijit Poojari
fuente
esta respuesta también contiene la consulta de restricción de caída. si alguien ha agregado getdate () anteriormente y ahora necesita modificarlo para obtener getutcdate (). él podría obtener ayuda con esta respuesta. @RalfFriedl
Abhijit Poojari