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 '.'
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)
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 que vous nommez la contrainte par défaut ... il vous sera pénible de la laisser tomber plus tard car elle aura un de ces noms générés par le système ... voir aussi Comment nommer les contraintes par défaut et comment les laisser tomber Contrainte sans nom dans SQL Server
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 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'il en existe déjà une, 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.
vous pouvez mettre les mots réservés entre crochets pour éviter ces erreurs:
dbo.TableName.[Date]
En fait, vous devez faire comme dans 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
Vous spécifiez le nom de la table deux fois. La partie ALTER TABLE nomme la table.
alter table TableName drop contrainte DF_TableName_WhenEntered
alter table TableName add contrainte DF_TableName_WhenEntered getutcdate () par défaut pour WhenEntered