数据字典生成工具之旅(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 ...
随机推荐
- FusionCharts的使用方法(php)
我们公司一直用这个图表统计, 最近整理了一下相关文档,提供大家学习. 首先可以看看 http://www.cnblogs.com/xuhongfei/archive/2013/04/12/301688 ...
- 这个错误,每个ScrumMaster都犯过
[小编]ScrumMaster要授之以渔,还是授之以鱼?从04年开始接触XP,到08年自己的团队开始提出敏捷的概念,再到10年接受ScrumMaster培训:在刚开始做ScrumMaster的一段时间 ...
- Linux high memory 学习总结
在free命令中有个参数l,它表示 show detailed low and high memory statistics.其实最先是对High Memory总是为零有些不解(Linux是64为). ...
- Javascript之旅——第一站:从变量说起
工作这几年,js学的不是很好,正好周末有些闲时间,索性买本<js权威指南>,大名鼎鼎的犀牛书,好好的把js深入的看一看.买过这本 书的第一印象就是贼厚,不过后面有一半部分都是参考手册. 一 ...
- 0015 Java学习笔记-集合-TreeMap集合
主要的方法 构造方法: TreeMap(); TreeMap(Comparator<?super K> comparator); TreeMap(Map<? extends K,? ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- Linux 性能优化工具 perf top
1. perf perf 是一个调查 Linux 中各种性能问题的有力工具. NAME perf - Performance analysis tools for Linux SYNOPSIS per ...
- my_shell
#include<stdio.h> #include<unistd.h> #include<string.h> #include<stdlib.h> # ...
- android canvas d
(以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的 ...
- JavaScript选项卡/页签/Tab的实现
选项卡,也称页签,英文用Tab(Module-Tabs)表示.Tab将不同的内容重叠放在一个布局块内,重叠的内容区里每次只有其中一个是可见的. Tab可以在相同的空间里展示更多的信息,它把相似的主题分 ...