2010-01-19 16 views
146

Tengo una tabla y una de las columnas es "Fecha" del tipo datetime. Hemos decidido añadir una restricción predeterminada a esa columnaAlterar la columna, agregar la restricción predeterminada

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

pero esto me da error:

Incorrect syntax near '.'

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

+9

¡No utilice tipos o palabras clave como nombres de columna! – JonH

+4

yup, estuvo de acuerdo- "¿Alguien ve algo obviamente mal aquí, que me falta (aparte de tener un mejor nombre para la columna)" – ram

Respuesta

279

Prueba este ejemplo

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

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 que el nombre del constraint..it por defecto será un dolor en el cuello para soltarlo más tarde, ya que tendrá uno de los sistema de loco nombres generados ... véase también How To Name Default Constraints And How To Drop Default Constraint Without A Name In SQL Server

6

se puede envolver palabras reservadas entre corchetes para evitar este tipo de errores:

dbo.TableName.[Date] 
+0

Parece una muy mala idea usar palabras reservadas para los nombres de las columnas. –

5

en realidad lo que tiene que hacer, como a continuación Ejemplo, lo 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 
5

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 este procedimiento almacenado elimina

Si intenta agregar un valor predeterminado a una columna cuando ya existe , obtendrá el siguiente error (algo que nunca verá si usa este procedimiento 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. 
Cuestiones relacionadas