我想测试一个给定的默认约束是否存在。我不想使用sysobjects表,而是更标准的INFORMATION_SCHEMA。
我之前用过这个来检查表和主键约束,但是我没有在任何地方看到默认约束。
它们不存在吗?(我正在使用MS SQL Server 2000)。
编辑:我想要通过约束名称来获取。
我想测试一个给定的默认约束是否存在。我不想使用sysobjects表,而是更标准的INFORMATION_SCHEMA。
我之前用过这个来检查表和主键约束,但是我没有在任何地方看到默认约束。
它们不存在吗?(我正在使用MS SQL Server 2000)。
编辑:我想要通过约束名称来获取。
我正在使用以下脚本检索所有默认值(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 = ''
对象目录视图: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;
SELECT DC.[name]
FROM [sys].[default_constraints] AS DC
WHERE DC.[parent_object_id] = OBJECT_ID('[Schema].[TableName]')
我认为这不在 INFORMATION_SCHEMA 中 - 你可能需要使用 sysobjects 或相关的弃用表/视图。
你会认为在 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 中会有一个类型,但我没有看到。
可能是因为在其他一些SQL DBMS上,“默认约束”并不是真正的约束,所以你在“INFORMATION_SCHEMA.TABLE_CONSTRAINTS”中找不到它的名称,所以你最好使用“INFORMATION_SCHEMA.COLUMNS”,就像其他人已经提到的那样。
(这里是SQLServer-ignoramus)
我唯一能想到需要知道“默认约束”名称的原因是如果SQLServer不支持"ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."
命令。但是那时你已经处于非标准区域,必须使用产品特定的方法来获取所需内容。
使用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