Modifier la colonne, ajouter une contrainte par défaut

187

J'ai une table et 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 "."

Quelqu'un voit-il quelque chose de manifestement faux ici, ce qui me manque (à part avoir un meilleur nom pour la colonne)

RAM
la source
11
N'utilisez pas de types ou de mots-clés comme noms de colonne!
JonH
8
oui, d'accord- "Est-ce que quelqu'un voit quelque chose de manifestement faux ici, ce qui me manque (autre que d'avoir un meilleur nom pour la colonne)"
ram

Réponses:

349

Essaye ça

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

assurez-vous également de nommer la contrainte par défaut..il sera pénible de la laisser tomber plus tard car elle aura l'un de ces noms générés par le système fou ... voir aussi Comment nommer les contraintes par défaut et comment supprimer la contrainte par défaut sans Un nom dans SQL Server

SQLMenace
la source
7

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

dbo.TableName.[Date]
Rayon
la source
1
Il semble être une très mauvaise idée d'utiliser des mots réservés pour les noms de colonnes.
Norbert Norbertson
4
Il semble, mais ce n'est pas le cas. Je les utilise avec succès depuis 2004 :)
Cătălin Rădoi
7

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

Il supprime automatiquement toutes les valeurs par défaut antérieures sur 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

Erreurs que cette procédure stockée élimine

Si vous essayez d'ajouter une valeur par défaut à une colonne alors qu'elle existe déjà, vous obtiendrez l'erreur suivante (quelque chose 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.
Contango
la source
5

En fait, vous devez faire comme ci-dessous l'exemple, 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
Ajit Kumar KV
la source
Cette utilisation juste pour la pratique, ne peut pas être utilisée dans la réalité
Trương Long
0

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] default getutcdate ()

Kelvin Lush
la source
0

alter table TableName drop contrainte DF_TableName_WhenEntered

alter table TableName ajouter la contrainte DF_TableName_WhenEntered default getutcdate () pour WhenEntered

Abhijit Poojari
la source
cette réponse contient également la requête de contrainte de suppression.Si quelqu'un avait ajouté getdate () plus tôt et qu'il doit maintenant le modifier en getutcdate (). il pourrait obtenir de l'aide grâce à cette réponse. @RalfFriedl
Abhijit Poojari