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

MSSQL
正确配置和使用SQL mail
关于DTS导入导出丢失默认值等对象
TOP N 和SET ROWCOUNT N 哪个更快
如何在视图中使用ORDER BY短语
如何区分大小写比较?
如何将作为字符串保存的IP地址变为二进制数值?
如何随机选取n条记录或者对记录作随机排序?
SQL脚本生成的一些BUG
如何使Microsoft SQL Server的日志文件不会增大?
利用事务日志来恢复Update、Delete误操作引起的数据丢
关于MSSQL占用过多内存的问题
SQL Server非正常删除日志文件(ldf)恢复方法
处理孤立用户的存储过程
1069错误(由于登录失败而无法启动服务)解决方法
SQL Server 7.0数据库的六种数据移动方法
利用SQL Server的扩展属性象access一样显示列的注释
Stored Procedure(存储过程)编写经验和优化措施
更新你的联机丛书
关于SQL Server中几个未公布的访问注册表的扩展存储过
存储过程替换text,ntext列中的字符串

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 117 ::
收藏到网摘: 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
按此在新窗口打开图片
所以记住,就因为你被告知没有更好的方法,依靠你作为一个数据库管理员的本能来钻研。你永远不会知道你可能会得到些什么。