199 votes

Modifier une colonne, ajouter une contrainte par défaut

J'ai une table dont l'une des colonnes est "Date" de type datetime. Nous avons décidé d'ajouter une contrainte par défaut à cette colonne

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

mais cela me donne une erreur :

Syntaxe incorrecte près de '.

Est-ce que quelqu'un voit quelque chose de manifestement erroné ici, qui m'échappe (à part un meilleur nom pour la colonne) ?

12 votes

N'utilisez pas de types ou de mots-clés comme noms de colonnes !

8 votes

Yup, d'accord - "Quelqu'un voit-il quelque chose de manifestement mauvais ici, que je ne vois pas (autre que d'avoir un meilleur nom pour la colonne)".

368voto

SQLMenace Points 68670

Essayez ceci

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

exemple

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id

insert bla default values

select * from bla

Veillez également à donner un nom à la contrainte par défaut. Il sera très difficile de la supprimer par la suite car elle portera l'un de ces noms farfelus générés par le système... voir aussi Comment nommer les contraintes par défaut et comment supprimer une contrainte par défaut sans nom dans SQL Server ?

7voto

Ray Points 12711

Vous pouvez mettre les mots réservés entre crochets pour éviter ce genre d'erreurs :

dbo.TableName.[Date]

1 votes

Cela semble être une très mauvaise idée d'utiliser des mots réservés pour les noms de colonnes.

4 votes

Il semble, mais ce n'est pas le cas. Je les utilise avec succès depuis 2004 :)

7voto

Contango Points 7976

J'utilise la procédure stockée ci-dessous pour mettre à jour les valeurs par défaut d'une colonne.

Il supprime automatiquement toutes les valeurs par défaut antérieures de la colonne, avant d'ajouter la nouvelle valeur par défaut.

Exemples d'utilisation :

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

Procédure stockée :

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

Les erreurs que cette procédure stockée élimine

Si vous essayez d'ajouter une valeur par défaut à une colonne alors qu'il en existe déjà une, vous obtiendrez l'erreur suivante (ce que vous ne verrez jamais si vous utilisez cette procédure stockée) :

-- 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.

5voto

Ajit Kumar KV Points 1

En fait, vous devez faire comme l'exemple ci-dessous, ce qui aidera à résoudre le problème...

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

0 votes

C'est juste pour s'entraîner, on ne peut pas l'utiliser dans la réalité.

0voto

Kelvin Lush Points 1

Vous spécifiez le nom de la table deux fois. La partie ALTER TABLE nomme la table. Essayez : Modifier la table TableName modifier la colonne [Date] par défaut getutcdate()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X