How do I find a default constraint using INFORMATION_SCHEMA?

前端 未结 14 814
猫巷女王i
猫巷女王i 2020-12-04 13:40

I\'m trying to test if a given default constraint exists. I don\'t want to use the sysobjects table, but the more standard INFORMATION_SCHEMA.

I\'ve used this to che

14条回答
  •  半阙折子戏
    2020-12-04 14:34

    Necromancing.
    If you only need to check if a default-constraint exists
    (default-constraint(s) may have different name in poorly-managed DBs),
    use INFORMATION_SCHEMA.COLUMNS (column_default):

    IF NOT EXISTS(
        SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE (1=1) 
        AND TABLE_SCHEMA = 'dbo' 
        AND TABLE_NAME = 'T_VWS_PdfBibliothek' 
        AND COLUMN_NAME = 'PB_Text'
        AND COLUMN_DEFAULT IS NOT NULL  
    )
    BEGIN 
        EXECUTE('ALTER TABLE dbo.T_VWS_PdfBibliothek 
                    ADD CONSTRAINT DF_T_VWS_PdfBibliothek_PB_Text DEFAULT (N''image'') FOR PB_Text; 
        '); 
    END 
    

    If you want to check by the constraint-name only:

    -- Alternative way: 
    IF OBJECT_ID('DF_CONSTRAINT_NAME', 'D') IS NOT NULL 
    BEGIN
        -- constraint exists, deal with it.
    END 
    

    And last but not least, you can just create a view called
    INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS:

    CREATE VIEW INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS 
    AS 
    SELECT 
         DB_NAME() AS CONSTRAINT_CATALOG 
        ,csch.name AS CONSTRAINT_SCHEMA
        ,dc.name AS CONSTRAINT_NAME 
        ,DB_NAME() AS TABLE_CATALOG 
        ,sch.name AS TABLE_SCHEMA 
        ,syst.name AS TABLE_NAME 
        ,sysc.name AS COLUMN_NAME 
        ,COLUMNPROPERTY(sysc.object_id, sysc.name, 'ordinal') AS ORDINAL_POSITION 
        ,dc.type_desc AS CONSTRAINT_TYPE 
        ,dc.definition AS COLUMN_DEFAULT 
    
        -- ,dc.create_date 
        -- ,dc.modify_date 
    FROM sys.columns AS sysc -- 46918 / 3892 with inner joins + where 
    -- FROM sys.all_columns AS sysc -- 55429 / 3892 with inner joins + where 
    
    INNER JOIN sys.tables AS syst 
        ON syst.object_id = sysc.object_id 
    
    INNER JOIN sys.schemas AS sch
        ON sch.schema_id = syst.schema_id 
    
    INNER JOIN sys.default_constraints AS dc 
        ON sysc.default_object_id = dc.object_id
    
    INNER JOIN sys.schemas AS csch
        ON csch.schema_id = dc.schema_id 
    
    WHERE (1=1) 
    AND dc.is_ms_shipped = 0 
    
    /*
    WHERE (1=1) 
    AND sch.name = 'dbo'
    AND syst.name = 'tablename'
    AND sysc.name = 'columnname'
    */
    

提交回复
热议问题