2010-01-19 30 views
146

Tôi có một bảng và một trong các cột là "Ngày" loại ngày giờ. Chúng tôi quyết định thêm một hạn chế mặc định để cột đóCột thay đổi, thêm ràng buộc mặc định

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

nhưng điều này mang lại cho tôi lỗi:

Incorrect syntax near '.'

Có ai nhìn thấy bất cứ điều gì rõ ràng là sai ở đây, mà tôi đang thiếu (trừ có một tên tốt hơn cho cột)

+9

Không sử dụng các loại hoặc từ khóa làm tên cột! – JonH

+4

yup, đồng ý- "Có ai nhìn thấy bất cứ điều gì rõ ràng là sai ở đây, mà tôi đang thiếu (khác hơn là có một tên tốt hơn cho cột)" – ram

Trả lời

279

Hãy thử điều này

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

dụ

create table bla (id int) 

alter table bla add constraint dt_bla default 1 for id 



insert bla default values 

select * from bla 

cũng chắc chắn rằng bạn đặt tên cho constraint..it mặc định sẽ là một cơn đau ở cổ để thả nó sau này bởi vì nó sẽ có một trong những hệ thống điên tên được tạo ra ... xem thêm How To Name Default Constraints And How To Drop Default Constraint Without A Name In SQL Server

6

bạn có thể quấn từ dành riêng trong dấu ngoặc vuông để tránh những loại lỗi:

dbo.TableName.[Date] 
+0

Nó có vẻ như một ý tưởng thực sự xấu để sử dụng từ dành riêng cho tên cột. –

5

Trên thực tế bạn phải làm như dưới đây Ví dụ, điều này sẽ giúp giải quyết vấn đề ...

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

Tôi sử dụng quy trình được lưu bên dưới để cập nhật các giá trị mặc định trên một cột.

Tự động xóa mọi giá trị mặc định trước trên cột, trước khi thêm mặc định mới.

Ví dụ về sử dụng:

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

Thủ tục lưu trữ:

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 

lỗi thủ tục lưu trữ này loại bỏ

Nếu bạn cố gắng thêm một mặc định cho một cột khi một đã tồn tại , bạn sẽ nhận được lỗi sau (một cái gì đó bạn sẽ không bao giờ nhìn thấy nếu sử dụng proc được lưu trữ này):

-- 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. 
Các vấn đề liên quan