我正在尝试测试是否存在给定的默认约束。我不想使用 sysobjects 表,而是更标准的 INFORMATION_SCHEMA。
我以前用它来检查表和主键约束,但我在任何地方都看不到默认约束。
他们不在那里吗? (我使用的是 MS SQL Server 2000)。
编辑:我正在寻找约束的名称。
原文由 WildJoe 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试测试是否存在给定的默认约束。我不想使用 sysobjects 表,而是更标准的 INFORMATION_SCHEMA。
我以前用它来检查表和主键约束,但我在任何地方都看不到默认约束。
他们不在那里吗? (我使用的是 MS SQL Server 2000)。
编辑:我正在寻找约束的名称。
原文由 WildJoe 发布,翻译遵循 CC BY-SA 4.0 许可协议
例如,如果目标数据库有超过 1M 的对象,则使用 sys.default_constraints
可以在扫描 sys.syscolpars
之后对 dflt
449af8933a81a0fb9ff240852c-7 进行 90%+ 的键查找 ---
你可能不在乎。在我的数据库上,从实际扫描的 158 次读取的 剩余 I/O 受损 1.12MM 行中仅组装 4 行需要 1.129 秒。
更改为使用当前的 sys.% 表/视图,使用 @Tim 的查询,在 2ms 内获得相同的 4 个约束。希望有人发现这和我发现蒂姆的一样有用:
SELECT ConstraintName = sdc.name
, SchemaName = ssch.name
, TableName = stab.name
, ColumnName = scol.name
FROM sys.objects sdc
INNER JOIN sys.columns scol
ON scol.default_object_id = sdc.object_id
INNER JOIN sys.objects stab
ON stab.object_id = scol.object_id
INNER JOIN sys.schemas ssch
ON ssch.schema_id = stab.schema_id;
原文由 SAinCA 发布,翻译遵循 CC BY-SA 4.0 许可协议
据我了解,默认值约束不是 ISO 标准的一部分,因此它们不会出现在 INFORMATION_SCHEMA 中。 INFORMATION_SCHEMA 似乎是此类任务的最佳选择,因为它是跨平台的,但如果信息不可用,则应使用对象目录视图 (sys.*) 而不是 SQL Server 中已弃用的系统表视图2005 年及以后。
以下与@user186476 的答案几乎相同。它返回给定列的默认值约束的名称。 (对于非 SQL Server 用户,您需要默认名称才能删除它,如果您自己不命名默认约束,SQL Server 会创建一些疯狂的名称,例如“DF_TableN_Colum_95AFE4B5”。为了更容易更改您将来的架构,始终明确命名您的约束!)