How do I find a default constraint using INFORMATION_SCHEMA?

前端 未结 14 715
猫巷女王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:14

    If you want to get a constraint by the column or table names, or you want to get all the constraints in the database, look to other answers. However, if you're just looking for exactly what the question asks, namely, to "test if a given default constraint exists ... by the name of the constraint", then there's a much easier way.

    Here's a future-proof answer that doesn't use the sysobjects or other sys tables at all:

    IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
       -- constraint exists, work with it.
    END
    
    0 讨论(0)
  • 2020-12-04 14:17

    How about using a combination of CHECK_CONSTRAINTS and CONSTRAINT_COLUMN_USAGE:

        select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name
              from information_schema.columns columns
                 inner join information_schema.constraint_column_usage usage on 
                      columns.column_name = usage.column_name and columns.table_name = usage.table_name
                 inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name
        where columns.column_default is not null
    
    0 讨论(0)
  • I am using folllowing script to retreive all defaults (sp_binddefaults) and all default constraint with following scripts:

    SELECT 
        t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName
    FROM  
        sys.all_columns c
        JOIN sys.tables t ON c.object_id = t.object_id
        JOIN sys.schemas s ON t.schema_id = s.schema_id
        LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
        LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name)
    WHERE 
        SC.COLUMN_DEFAULT IS NOT NULL
        --WHERE t.name = '' and c.name = ''
    
    0 讨论(0)
  • 2020-12-04 14:21

    As I understand it, default value constraints aren't part of the ISO standard, so they don't appear in INFORMATION_SCHEMA. INFORMATION_SCHEMA seems like the best choice for this kind of task because it is cross-platform, but if the information isn't available one should use the object catalog views (sys.*) instead of system table views, which are deprecated in SQL Server 2005 and later.

    Below is pretty much the same as @user186476's answer. It returns the name of the default value constraint for a given column. (For non-SQL Server users, you need the name of the default in order to drop it, and if you don't name the default constraint yourself, SQL Server creates some crazy name like "DF_TableN_Colum_95AFE4B5". To make it easier to change your schema in the future, always explicitly name your constraints!)

    -- returns name of a column's default value constraint 
    SELECT
        default_constraints.name
    FROM 
        sys.all_columns
    
            INNER JOIN
        sys.tables
            ON all_columns.object_id = tables.object_id
    
            INNER JOIN 
        sys.schemas
            ON tables.schema_id = schemas.schema_id
    
            INNER JOIN
        sys.default_constraints
            ON all_columns.default_object_id = default_constraints.object_id
    
    WHERE 
            schemas.name = 'dbo'
        AND tables.name = 'tablename'
        AND all_columns.name = 'columnname'
    
    0 讨论(0)
  • 2020-12-04 14:21

    I don't think it's in the INFORMATION_SCHEMA - you'll probably have to use sysobjects or related deprecated tables/views.

    You would think there would be a type for this in INFORMATION_SCHEMA.TABLE_CONSTRAINTS, but I don't see one.

    0 讨论(0)
  • 2020-12-04 14:26

    You can use the following to narrow the results even more by specifying the Table Name and Column Name that the Default Constraint correlates to:

    select * from sysobjects o 
    inner join syscolumns c
    on o.id = c.cdefault
    inner join sysobjects t
    on c.id = t.id
    where o.xtype = 'D'
    and c.name = 'Column_Name'
    and t.name = 'Table_Name'
    
    0 讨论(0)
提交回复
热议问题