SQL Server默认值中的所有字段的列出

数据库 SQL Server
我们今天主要和大家一起分享的是列出SQL Server默认值中的所有字段,以下就是文章的详细内容介绍,望大家借鉴。

此文章主要介绍的是列出SQL Server默认值中的所有字段,上个星期我在对一个供应商开发的实际应用数据库按规定进行故障排除的时候,我们需要对他们数据库中50个表的每一个都进行查看,以确保所有期望是SQL Server默认值的字段都被分配了默认值。

你可以想象这是一个多么令人畏惧的工作,而我立即提

 

上个星期我在对一个供应商开发的数据库按规定进行故障排除的时候,我们需要对他们数据库中50个表的每一个都进行查看,以确保所有期望是默认值的字段都被分配了默认值。你可以想象这是一个多么令人畏惧的工作,而我立即提出了这个问题。有没有一个比在SQL Server管理套件中打开每一个表来查看这个schema的更好方法吗?

 

专家解答

 

通过查询任何数据库中的三个系统表,你可以获得每个表的每一个字段的SQL Server默认值。下面是这个核心查询。它返回分配给当前数据库中每个用户表的SQL Server默认值。这个查询在SQL 2000和SQL 2005中都是兼容的。

  1. SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value"   
  2. FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id   
  3. LEFT JOIN dbo.syscomments SM ON SC.cdefault = SM.id   
  4. WHERE SO.xtype = 'U'   
  5. ORDER BY SO.[name], SC.colid  

sysobjects 为我们提供了表元数据。在这个例子中,我们只对表名称感兴趣。syscolumns 表存储与每个表的各个字段相关联的元数据。在这个例子中,我们只需要字段名称。***,SQL Server默认值元数据由syscomments表提供。

 

对Northwind数据库运行这个查询生成下面的结果(为了简短,省略了一些记录)。注意,因为LEFT JOIN到syscomments表所以它将返回NULL默认值。

 

现在我在想这个很好的基本查询版本有什么选择。。。

选择1:搜索特别的默认值

通过编辑WHERE条件语句,我们可以在所有的表中查看特别的SQL Server默认值。

  1. SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value"   
  2. FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id   
  3. LEFT JOIN dbo.syscomments SM ON SC.cdefault = SM.id   
  4. WHERE SO.xtype = 'U' AND SM.TEXT = '(0)'   
  5. ORDER BY SO.[name], SC.colid  

选择2:只返回具有SQL Server默认值字段的信息

修改核心查询的WHERE条件语句来忽略syscomments.text表中的NULL值,这个技巧如下所示:

  1. SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value"   
  2. FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id   
  3. LEFT JOIN dbo.syscomments SM ON SC.cdefault = SM.id   
  4. WHERE SO.xtype = 'U' AND SM.TEXT IS NOT NULL   
  5. ORDER BY SO.[name], SC.colid  

但是,将FROM条件从句中的JOIN从一个LEFT JOIN改为一个INNER JOIN会提供优化:

 

  1. SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value"   
  2. FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id   
  3. INNER JOIN dbo.syscomments SM ON SC.cdefault = SM.id   
  4. WHERE SO.xtype = 'U'   
  5. ORDER BY SO.[name], SC.colid  

其实还有另一个选择,利用SQL 2005中的系统目录视图。前面的查询给我提供了这时所需要的信息,并在SQL 2000和SQL 2005中都可以使用,在SQL2000实例中可以挖掘出与这个SQL Server默认值(实际上是一个默认约束)关联的额外元数据。通过将这个查询特定在系统目录视图上,我们可以获得在之前的查询中没有显示出来的额外信息。

  1. SELECT ST.[name] AS "Table Name", SC.[name] AS "Column Name", SD.definition AS "Default Value", SD.[name] AS "Constraint Name"   
  2. FROM sys.tables ST INNER JOIN sys.syscolumns SC ON ST.[object_id] = SC.[id]   
  3. INNER JOIN sys.default_constraints SD ON ST.[object_id] = SD.[parent_object_id] AND SC.colid = SD.parent_column_id   
  4. ORDER BY ST.[name], SC.colid  

所以记住,就因为你被告知没有更好的方法,依靠你作为一个数据库管理员的本能来钻研。你永远不会知道你可能会得到些什么。

 

【编辑推荐】

  1. SQL Server数据库Processor Affinity概述
  2. 破解SQL Server占内存过多很简单!
  3. SQL Server 2005快照与查询的使用场景
  4. 从Oracle数据库到SQL Server透明网关的正确配置
  5. SQL Server拆分字符串的3常用种方法

 

责任编辑:佚名 来源: 每日经济新闻
相关推荐

2010-09-28 10:23:36

SQL修改字段

2010-09-03 10:52:10

SQL删除

2010-10-22 16:56:35

sql server删

2010-09-28 15:24:43

sql语句

2010-09-28 10:35:58

SQL字段默认值

2010-09-07 16:05:23

SQL语句删除

2021-02-25 13:40:17

MySQL数据库默认值

2012-08-01 09:50:11

交互设计UI设计

2010-09-25 15:37:38

SQL语句

2010-10-22 15:36:57

2010-10-20 10:04:36

sql server自

2010-06-28 09:59:47

SQL Server自

2018-04-12 13:41:14

Windows 10Windows文件关联重置

2010-11-09 12:09:23

SQL Server查

2010-07-14 17:37:33

SQL Server

2010-09-08 13:21:19

SQL删除约束

2018-04-13 14:32:02

Windows10文件关联默认值

2010-07-09 12:49:41

SQL Server自

2022-06-21 08:13:34

MySQL查询数据库

2010-11-23 16:49:42

MySQL设置当前时间
点赞
收藏

51CTO技术栈公众号