当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 列出SQL Server中具有默认值的所有字段的语句

MSSQL
优化SQL Server索引的小技巧
SQL Server的空值处理策略
Windows上的MySQL UDF开发
MS SQLSERVER中如何快速获取表的记录总数
MS SQLSERVER 中如何得到表的创建语句
使用索引调节向导调整应用程序的性能
使用查询分析器调整SQL服务器脚本
SQL Server到Oracle连接服务器的实现
数据库查询结果的动态排序(6)
数据库查询结果的动态排序(7)
保持Oracle数据库优良性能的若干诀窍
数据库管理员制胜之宝
在Linux下访问MS SQL Server数据库
关于如何在查询结果中添加自动编号
如何提取除最新十条记录之外的所有记录?
一个有关DISTINCT的问题解答
关于MSSQL Server中DATETIME类型数据的处理
TOP N 和SET ROWCOUNT N 哪个更快?
金额阿拉伯数字转换为中文的存储过程
谈谈数据从sql server数据库导入mysql数据库的体验

MSSQL 中的 列出SQL Server中具有默认值的所有字段的语句


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 76 ::
收藏到网摘: n/a

上个星期我在对一个供应商开发的数据库按规定进行故障排除的时候,我们需要对他们数据库中50个表的每一个都进行查看,以确保所有期望是默认值的字段都被分配了默认值。你可以想象这是一个多么令人畏惧的工作,而我立即提出了这个问题。有没有一个比在SQL Server管理套件中打开每一个表来查看这个schema的更好方法吗? 专家解答
  通过查询任何数据库中的三个系统表,你可以获得每个表的每一个字段的默认值。下面是这个核心查询。它返回分配给当前数据库中每个用户表的默认值。这个查询在SQL 2000和SQL 2005中都是兼容的。
  
Quote:
复制代码 代码如下:

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

  sysobjects 为我们提供了表元数据。在这个例子中,我们只对表名称感兴趣。syscolumns 表存储与每个表的各个字段相关联的元数据。在这个例子中,我们只需要字段名称。最后,默认值元数据由syscomments表提供。
  对Northwind数据库运行这个查询生成下面的结果(为了简短,省略了一些记录)。注意,因为LEFT JOIN到syscomments表所以它将返回NULL默认值。
按此在新窗口打开图片
现在我在想这个很好的基本查询版本有什么选择。。。
  选择1:搜索特别的默认值
  通过编辑WHERE条件语句,我们可以在所有的表中查看特别的默认值。
  
Quote:
SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value"
  FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id
  LEFT JOIN dbo.syscomments SM ON SC.cdefault = SM.id
  WHERE SO.xtype = 'U' AND SM.TEXT = '(0)'
  ORDER BY SO.[name], SC.colid
选择2:只返回具有默认值字段的信息
  修改核心查询的WHERE条件语句来忽略syscomments.text表中的NULL值,这个技巧如下所示:
  
Quote:
复制代码 代码如下:

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

  但是,将FROM条件从句中的JOIN从一个LEFT JOIN改为一个INNER JOIN会提供优化:
  
Quote:
复制代码 代码如下:

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

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

SELECT ST.[name] AS "Table Name", SC.[name] AS "Column Name", SD.definition AS "Default Value", SD.[name] AS "Constraint Name"
  FROM sys.tables ST INNER JOIN sys.syscolumns SC ON ST.[object_id] = SC.[id]
  INNER JOIN sys.default_constraints SD ON ST.[object_id] = SD.[parent_object_id] AND SC.colid = SD.parent_column_id
  ORDER BY ST.[name], SC.colid
按此在新窗口打开图片
所以记住,就因为你被告知没有更好的方法,依靠你作为一个数据库管理员的本能来钻研。你永远不会知道你可能会得到些什么。