如何使用INFORMATION_SCHEMAfind默认约束?

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

我已经使用它来检查表和主键约束,但我没有看到任何地方的默认约束。

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

编辑:我期待得到的约束的名称。

据我了解,默认值约束不是ISO标准的一部分,所以它们不会出现在INFORMATION_SCHEMA中。 INFORMATION_SCHEMA似乎是这类任务的最佳select,因为它是跨平台的,但是如果信息不可用,则应该使用对象目录视图(sys。*)而不是系统表视图,这在SQL Server中不推荐使用2005年及以后。

下面几乎和@ user186476的答案一样。 它返回给定列的默认值约束的名称。 (对于非SQL Server用户,您需要使用默认名称才能删除它,如果您自己没有指定默认约束,SQL Server会创build一些疯狂的名称,例如“DF_TableN_Colum_95AFE4B5”。为了更容易更改将来你的模式,总是明确地命名你的约束!)

-- 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' 

通过指定默认约束关联的表名和列名,您可以使用以下方法来缩小结果的范围:

 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' 

Information_Schema视图中似乎没有默认约束名称。

使用SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name按名称查找默认约束

下面的脚本列出了数据库中用户表的所有缺省约束和缺省值:

 SELECT b.name AS TABLE_NAME, d.name AS COLUMN_NAME, a.name AS CONSTRAINT_NAME, c.text AS DEFAULT_VALUE FROM sys.sysobjects a INNER JOIN (SELECT name, id FROM sys.sysobjects WHERE xtype = 'U') b on (a.parent_obj = b.id) INNER JOIN sys.syscomments c ON (a.id = c.id) INNER JOIN sys.syscolumns d ON (d.cdefault = a.id) WHERE a.xtype = 'D' ORDER BY b.name, a.name 

INFORMATION_SCHEMA.COLUMNS的COLUMN_DEFAULT列是你在找什么?

 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 

如果要通过列名或表名得到约束,或者想要获取数据库中的所有约束,请查看其他答案。 但是,如果您只是在寻找问题的具体内容,即“testing一个给定的默认约束是否存在……约束的名称” ,则有一个更简单的方法。

这是一个未来的答案,根本不使用sysobjects或其他sys表:

 IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN -- constraint exists, work with it. END 

对象目录视图 :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; 

我不认为它在INFORMATION_SCHEMA – 你可能不得不使用sysobjects或相关的弃用表/视图。

你可能会认为在INFORMATION_SCHEMA.TABLE_CONSTRAINTS中会有这种types,但是我没有看到。

可能是因为在其他一些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 

我正在使用folllowing脚本来检索所有默认值(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 = '' 
 WHILE EXISTS( SELECT * FROM sys.all_columns INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id INNER JOIN sys.schemas ON ST.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 ST.name = 'MyTable' ) BEGIN DECLARE @SQL NVARCHAR(MAX) = N''; SET @SQL = ( SELECT TOP 1 'ALTER TABLE ['+ schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';' FROM sys.all_columns INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id INNER JOIN sys.schemas ON ST.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 ST.name = 'MyTable' ) PRINT @SQL EXECUTE sp_executesql @SQL --End if Error IF @@ERROR <> 0 BREAK END