SELECT 表名=CASE WHEN a.colorder = 1 THEN d.name ELSE ” END, 表说明=CASE WHEN a.colorder = 1 THEN isnull(f.value, ”) ELSE ” END , 字段序号=a.colorder , 字段名=a.name , 标识=CASE WHEN COLUMNPROPERTY(a.id, a.name, ‘IsIdentity’) = 1 THEN ‘√’ ELSE ” END , 主键=CASE WHEN EXISTS ( SELECT 1 FROM dbo.sysindexes si INN
在SQL Server 2005和SQL Server 2008中,管理和查询数据库的表结构信息是一项重要的任务,这有助于数据库管理员理解数据库的设计、优化性能以及进行迁移或升级操作。本文将深入探讨如何查询这些信息,特别是涉及外键的部分。
查询表结构信息通常涉及到对系统内置视图和函数的使用,例如`sys.columns`、`sys.types`、`sys.objects`等。这些视图提供了关于表、列、数据类型和对象属性的详细信息。在提供的SQL查询中,我们看到以下关键字段的获取:
1. **表名**:当`a.colorder = 1`时,即表的第一个列,取自`d.name`,否则为空。这里的`d`引用的是`sysobjects`视图,它包含了对象的名称。
2. **表说明**:同样,当`a.colorder = 1`时,使用`isnull(f.value, ”)`获取扩展属性的值,否则为空。`f`是通过`sys.extended_properties`视图获取的,用于存储对象的元数据信息。
3. **字段序号**:直接来自`a.colorder`,表示字段在表中的顺序。
4. **字段名**:通过`a.name`获取,这是`sys.columns`视图中的字段名称。
5. **标识**:使用`COLUMNPROPERTY`函数判断该列是否为主键,如果为1,则返回'√',否则为空。
6. **主键**:通过子查询检查是否存在名为'PK'的索引,与当前列关联,从而判断是否为主键。
7. **外键**:利用自定义的临时表`tony`(可能在查询前已创建),如果外键存在,返回'√',否则为空。
8. **外键表**:当外键存在时,返回外键引用的表的名称,使用`object_name()`函数。
9. **外键字段**:通过`syscolumns`视图找到外键引用的列的名称。
10. **类型**:根据`xtype`获取字段的数据类型,通过`systypes`视图。
11. **长度**:直接从`a.length`获取字段的长度。
12. **精度**和**小数位数**:使用`COLUMNPROPERTY`函数获取数值类型的精度和小数位数。
13. **允许空**:如果`a.isnullable = 1`,表示字段允许为空,返回'√',否则为空。
14. **默认值**:通过`syscomments`视图获取列的默认值。
15. **字段说明**:通过`sys.extended_properties`获取字段的描述。
16. **创建时间**和**更改时间**:分别从`d.crdate`和`d.refdate`获取对象的创建和修改时间。
查询通过指定的表名(如'tb')过滤,并按表ID和列顺序排序。这个查询可以作为数据库维护的实用工具,帮助理解表的结构,特别是对于含有复杂外键关系的数据库,能清晰地展示出这些依赖关系。
在SQL Server的升级过程中,了解这些详细信息至关重要,因为它们可以帮助识别潜在的兼容性问题,确保升级后的数据库功能完整且性能良好。例如,从SQL Server 2005或2008升级到更高版本时,需要确保所有的外键约束、主键约束、索引和默认值都正确无误。此外,还需要注意数据类型的兼容性、存储过程和触发器的更新,以及安全性和性能优化设置的调整。