如何使用INFORMATION_SCHEMA查找默认约束?
我正在尝试测试是否存在给定的默认约束。我不想使用sysobjects表,而是使用更标准的INFORMATION_SCHEMA。
我以前曾用它来检查表和主键约束,但是在任何地方都看不到默认约束。
他们不在吗? (我正在使用MS SQL Server 2000)。
编辑:我正在寻找通过约束的名称。
解决方案
我们正在寻找INFORMATION_SCHEMA.COLUMNS的COLUMN_DEFAULT列吗?
我认为它可能不在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 ..."命令。但是,那时我们已经处在非标准区域,则必须使用特定于产品的方式来获得所需的东西。
" Information_Schema"视图中似乎没有默认约束名称。
使用SELECT * FROM sysobjects WHERE xtype ='D'AND name = @ name
通过名称查找默认约束
我们可以通过指定默认约束与之相关的表名和列名,使用以下内容进一步缩小结果范围:
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'
如何结合使用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
select c.name, col.name from sys.default_constraints c inner join sys.columns col on col.default_object_id = c.object_id inner join sys.objects o on o.object_id = c.parent_object_id inner join sys.schemas s on s.schema_id = o.schema_id where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName