数据字典生成工具之旅(8):SQL查询表的约束默认值等信息
上一篇代码生成工具里面已经用到了读取表结构的SQL,这篇将更加详细的介绍SQL SERVER常用的几张系统表和视图!
阅读目录
系统表视图介绍
1.sys.tables(用户表)
SELECT name,object_id FROM sys.tables

上面SQL是用来查询数据库里面所有用户创建的表,name为表名,object_id为表的对象id。其中object_id的值也可以用系统函数OBJECT_ID()来取
SELECT OBJECT_ID('Other')

可以看到两者的值是一样的。
2.sys.views(用户视图)
SELECT * FROM sys.views

可以看到结果集中也是包含object_id这一列的,并且这个值也是不相同的,相当于主键列。后面会用到这一点。
3.sys.columns(列视图)
SELECT * FROM sys.columns

sys.tables和sys.columns是通过object_id这一列进行关联的。说了几个视图相信大家都有了直观的印象,会不会有这个疑问有没有这样一个视图能知道系统所有的数据对象呢,答案是肯定的。
4.sys.objects(数据对象视图)
SELECT name,object_id,type FROM sys.objects

我这里特意标红了type这一列,type常用的值及含义
| FN | 标量函数 |
| P | 存储过程 |
| PK | 主键 |
| TF | 表值函数 |
| U | 用户表 |
| V | 视图 |
sp_helptext fn_Spilt

创建语句就知道了,这里提供另外一个好的工具,书写SQL和提示方面更加智能SQL Prompt,在做数据库开发时提效不只是一点点哦,这里上几张截图,有关该工具详细介绍可以参考SQL Prompt——SQL智能提示插件这篇介绍。


实际应用
介绍完上面几个重要的视图以后,这里介绍一下这些视图的实际作用。
- 创建可重复执行的语句
IF NOT EXISTS(SELECT 1 FROM sys.objects WHERE object_id=object_id('Test'))
BEGIN
CREATE TABLE Test(
num INT
)
END
通过判断sys.objects视图是否存在test对象来决定是否创建表,这样就算SQL一直执行都不会报错了。
2. 清空数据库表数据
要清空一个表的数据很简单,直接执行下面SQL即可。可是表多了呢,复制粘贴肯定很麻烦。这个时候sys.tables可以帮上忙了。
TRUNCATE TABLE dbo.myuser
DECLARE @Total AS INT
DECLARE @i AS INT
DECLARE @name AS VARCHAR(200)
SELECT name,IDENTITY(INT,1,1) AS Id INTO #TempDelTable FROM sys.tables SELECT @Total=COUNT(1),@i=1 FROM #TempDelTable WHILE @i<=@Total
BEGIN
SELECT @name=name FROM #TempDelTable WHERE Id=@i
EXEC('TRUNCATE TABLE '+@name)
SELECT @i=@i+1
END
DROP TABLE #TempDelTable
3. 查询表的相关信息(表中文名,字段中文名,是否主键....)
如何通过SQL来直观的查询出表的字段相关信息呢,下面提供SQL
GO
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id=object_id('fn_DataDic'))
BEGIN
DROP FUNCTION dbo.fn_DataDic
END
GO
CREATE FUNCTION [dbo].[fn_DataDic](@table_name VARCHAR(50))
RETURNS @Result TABLE(
table_name VARCHAR(100),--表英文名--
table_name_c VARCHAR(100),--表中文名--
field_name VARCHAR(100), --列名--
field_name_c VARCHAR(100), --列名中文名--
file_sequence INT,--列顺序--
id VARCHAR(100),--表的id--
colid VARCHAR(100),--列的id--
date_type VARCHAR(50),--数据类型--
width INT,--数据宽度--
pk bit,--是否主键--
defaultvalue VARCHAR(100),--默认值--
isnullable bit, --是否可空--
isidentity bit --是否主动增长--
)
AS /**************************************************************
*函数功能:查询数据库中用户表和视图的数据字典
*输入参数:
@table_name:表名 如果为NULL或''则查询所有的表或视图
*返回值:
table_name VARCHAR(100),--表英文名--
table_name_c VARCHAR(100),--表中文名--
field_name VARCHAR(100), --列名--
field_name_c VARCHAR(100), --列名中文名--
file_sequence INT,--列顺序--
id VARCHAR(100),--表的id--
colid VARCHAR(100),--列的id--
date_type VARCHAR(50),--数据类型--
width INT,--数据宽度--
pk bit,--是否主键--
defaultvalue VARCHAR(100),--默认值--
isnullable bit, --是否可空--
isidentity bit --是否主动增长-- *2013-03-29__dudj__创建
***************************************************************/
BEGIN
IF @table_name IS NULL OR LTRIM(RTRIM(@table_name))=''
BEGIN
INSERT INTO @Result
SELECT
T.name AS table_name,
'' AS table_name_c,
C.name AS field_name,
'' AS field_name_c,
C.colorder AS file_sequence,
C.id AS id,
C.colid AS colid,
TYPE_NAME(C.xtype) AS date_type,
C.length AS width,
convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in (
select name from sysindexes where indid in(
select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) AS pk,
ISNULL(CM.text,'') AS defaultvalue,
ISNULL(C.isnullable,1) AS isnullable,
ISNULL(COLUMNPROPERTY(c.id,c.name,'IsIdentity'),0) AS isidentity
FROM sysobjects AS T
LEFT JOIN syscolumns AS C
ON c.id=T.id
LEFT JOIN syscomments CM on c.cdefault=CM.id
WHERE T.xtype IN ('U','V')
END
ELSE
BEGIN
INSERT INTO @Result
SELECT
T.name AS table_name,
'' AS table_name_c,
C.name AS field_name,
'' AS field_name_c,
C.colorder AS file_sequence,
C.id AS id,
C.colid AS colid,
TYPE_NAME(C.xtype) AS date_type,
C.length AS width,
convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in (
select name from sysindexes where indid in(
select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) AS pk,
ISNULL(CM.text,'') AS defaultvalue,
ISNULL(C.isnullable,1) AS isnullable,
ISNULL(COLUMNPROPERTY(c.id,c.name,'IsIdentity'),0) AS isidentity
FROM sysobjects AS T
LEFT JOIN syscolumns AS C
ON c.id=T.id
LEFT JOIN syscomments CM on c.cdefault=CM.id
WHERE T.xtype IN ('U','V') AND (T.NAME=@table_name)
END /*更新表名中文,列名中文说明*/
UPDATE @Result SET table_name_c=
(
SELECT
CONVERT(VARCHAR(100),P.VALUE)
FROM sys.extended_properties AS P
WHERE P.minor_id=0 AND P.major_id=id
),field_name_c =
(
SELECT
CONVERT(VARCHAR(100),P.VALUE)
FROM sys.extended_properties AS P
WHERE P.major_id = id AND P.minor_id = colid
) RETURN
END
GO
先创建一个视图,方便以后重复使用,创建好以后这样使用
SELECT * FROM dbo.fn_DataDic('myuser')

本章总结
通过几个系统视图的介绍和实际例子结合,完成了表的详细信息的取数,数据字典生成工具和代码生成工具里面都有用到相关内容。介绍到这里或许你会对上图中的表中文名和列中文名怎么出来的不明白。

这些信息是存储在拓展属性这里的,可以通过SELECT * FROM sys.extended_properties 来进行查询。
工具源代码下载
目前总共有经过了七个版本的升级,现在提供最新版本的下载地址
| 数据字典生成工具V2.0安装程序 | 最新安装程序 | |
| 数据字典生成工具源代码 | 最新源代码 | |
| http://code.taobao.org/svn/DataDicPub | SVN最新源码共享地址 | |
学习使用
如果你使用了该工具,或者想学习该工具,欢迎加入这个小组,一起讨论数据字典生成工具、把该工具做的更强,更方便使用,一起加入147425783 QQ群。
更多数据字典生成工具资料请点击数据字典生成工具专题。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。
因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是焰尾迭 。
数据字典生成工具之旅(8):SQL查询表的约束默认值等信息的更多相关文章
- 数据字典生成工具之旅(5):DocX组件读取与写入Word
由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocity篇,到时会讲解怎么使用NVelocity做一款简易的代码生成器,敬请期待!),好了正式进入本篇内容. 这 ...
- 数据字典生成工具之旅(3):PowerDesign文件组成结构介绍及操作
从这篇开始将正式讲解整个重要部分的实现细节,本篇讲解Pdm文件的解析.其实PDM文件就是XML文件,可以用Editplus或者VS打开查看.了解到这一点之后大家就能猜到,可以用解析XML的方式读取PD ...
- 数据字典生成工具之旅(4):NPOI操作EXECL
这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的 ...
- 数据字典生成工具之旅(6):NVelocity语法介绍及实例
本章开始将会为大家讲解NVelocity的用法,并带领大家实现一个简单的代码生成器. NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语 ...
- 数据字典生成工具之旅(7):NVelocity实现代码生成器
这个系统好久没有更新了,人也慢慢变懒了,从现在开始每个月至少写三篇文章,欢迎大家监督.对了预告一下,该系列完成以后将为大家带来WebApp开发系列篇,敬请期待.先上几张图,放在文章最后面欢迎预览! 本 ...
- 数据字典生成工具(生成Excel, Word,PDF,html)
转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...
- SQL Server date 设置默认值
根据时间做数据统计计算最讨厌开始和结束时间字段是NULL,为了处理NULL要写很多语句. 那么在数据库设计的时候给一个默认值:0001-01-01和9999-12-31,会给开发人员带来很大的便利. ...
- oracle 以及 sql server mysql 空值默认值修改
在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...
- SQL 添加字段和默认值脚本
--插入字段和默认值alter table Acc_WayBill add DeclaredValue nvarchar(50)goEXEC sys.sp_addextendedproperty @n ...
随机推荐
- json对象转为字符串,当做参数传递时加密解密
[son对象 字符串 互相转行] 比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex ...
- nutz如何体现mvc思想的
如何理解web mvc框架?? 一.没有使用mvc框架之前我们都是自己根据mvc分层思想的理解去把它物理化,比如:根据包的命名,根据类的后缀名,根据文件夹的命名去定义分层. 因为每个人对mvc的理解不 ...
- HTML5 review
标签: section:适用于独立结构内容,无结构关系(例如article,aside与其他标签可以组合形成具有特定结构关系的标签结构).须具有标题(待考证). menu&nav:menu用于 ...
- 让UNION与ORDER BY并存于SQL语句当中
在SQL语句中,UNION关键字多用来将并列的多组查询结果(表)合并成一个结果(表),简单实例如下: SELECT [Id],[Name],[Comment] FROM [Product1] UNIO ...
- Nginx中文手册
Nginx 常见应用技术指南[Nginx Tips] 第二版 作者:NetSeek http://www.linuxtone.org (IT运维专家网|集群架构|性能调优) 目 录 一. Nginx ...
- 从客户端中检测到有潜在危险的Request.Form值的详细解决方案
ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidatio ...
- contiki在keil下的stm32平台移植
参考博客: http://www.aiuxian.com/article/p-705047.html http://blog.csdn.net/u013232419/article/details/4 ...
- 六、Android学习第五天——Handler的使用(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...
- C# WebService动态调用
前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 REST ...
- [转]VS2010中如何创建一个WCF
本文转自:http://www.cnblogs.com/zhangliangzlee/archive/2012/08/28/2659701.html 转载:http://www.cnblogs.com ...