如何使用INFORMATION_SCHEMA查找默认约束?

139

我想测试一个给定的默认约束是否存在。我不想使用sysobjects表,而是更标准的INFORMATION_SCHEMA。

我之前用过这个来检查表和主键约束,但是我没有在任何地方看到默认约束。

它们不存在吗?(我正在使用MS SQL Server 2000)。

编辑:我想要通过约束名称来获取。

16个回答

0

我正在使用以下脚本检索所有默认值(sp_binddefaults)和所有默认约束:

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

对象目录视图:sys.default_constraints

信息模式视图INFORMATION_SCHEMA符合ANSI标准,但默认约束不是ISO标准的一部分。Microsoft SQL Server提供了系统目录视图,用于获取有关SQL Server对象元数据的信息。

sys.default_constraints系统目录视图用于获取有关默认约束的信息。

SELECT so.object_id TableName,
       ss.name AS TableSchema,
       cc.name AS Name,
       cc.object_id AS ObjectID,              
       sc.name AS ColumnName,
       cc.parent_column_id AS ColumnID,
       cc.definition AS Defination,
       CONVERT(BIT,
               CASE cc.is_system_named
                   WHEN 1
                   THEN 1
                   ELSE 0
               END) AS IsSystemNamed,
       cc.create_date AS CreationDate,
       cc.modify_date AS LastModifiednDate
FROM sys.default_constraints cc WITH (NOLOCK)
     INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id
     LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id
     LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id
                                               AND sc.object_id = cc.parent_object_id
ORDER BY so.name,
         cc.name;

0
一种更简洁的方法是:
SELECT DC.[name]
  FROM [sys].[default_constraints] AS DC
  WHERE DC.[parent_object_id] = OBJECT_ID('[Schema].[TableName]') 

0

我认为这不在 INFORMATION_SCHEMA 中 - 你可能需要使用 sysobjects 或相关的弃用表/视图。

你会认为在 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 中会有一个类型,但我没有看到。


0

可能是因为在其他一些SQL DBMS上,“默认约束”并不是真正的约束,所以你在“INFORMATION_SCHEMA.TABLE_CONSTRAINTS”中找不到它的名称,所以你最好使用“INFORMATION_SCHEMA.COLUMNS”,就像其他人已经提到的那样。

(这里是SQLServer-ignoramus)

我唯一能想到需要知道“默认约束”名称的原因是如果SQLServer不支持"ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."命令。但是那时你已经处于非标准区域,必须使用产品特定的方法来获取所需内容。


0

使用CHECK_CONSTRAINTS和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

CONSTRAINT_COLUMN_USAGE 不包含任何有关默认约束的信息。 - Stephen Turner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接