数据字典生成工具之旅(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 ...
随机推荐
- nexus搭建maven私服
下载nexus 首先,从以下地址下载nexus: http://www.sonatype.com/download-oss-sonatype 选择下载nexus-2.13.0-01-bundle.ta ...
- Java是如何处理别名(aliasing)的
什么是Java别名(aliasing) 别名意味着有多个别名指向同一个位置,且这些别名有不同的类型. 在下面的代码例子中,a和b是两个不同的名字,有不同的类型A和B,B继承A B[] b = new ...
- 2014.1.23 Discuz论坛迁移+VPS配置手记
虽说这也不是我第一次转移这个论坛了,但毕竟还是第一次自己配置VPS,写点东西记一下 一:关于VPS的配置 1.用TeamViewer连接服务器 这个VPS的IDC自己带有一个远程控制的页面,用浏览器打 ...
- 解决easy ui 1.4datebox控件不能清空的问题
用easy ui遇到这个问题,在网上找到了解决方案,不过是1.3.6版本的.现提供1.4版本的修改的具体位置和代码. 我们用的是这个 修改位置:12739行,添加代码: , { text: funct ...
- Java Security:Java加密框架(JCA)简要说明
加密服务总是关联到一个特定的算法或类型,它既提供了密码操作(如Digital Signature或MessageDigest),生成或供应所需的加密材料(Key或Parameters)加密操作,也会以 ...
- easyui datagrid 键盘上下控制选中行
扩展datagrid的一个方法keyCtr $.extend($.fn.datagrid.methods, { keyCtr : function (jq) { return jq.each(fun ...
- FFMPEG ./configure 参数及意义
FFMPEG版本:2.6.2,编译环境:ubuntu 14.4. 不同版本的FFMPEG参数可能不同,可在FFMPEG目录下使用以下命令查看 ./configure --help --help pri ...
- 烂泥:学习Nagios(三): NRPE安装及配置
本文由秀依林枫提供友情赞助,首发于烂泥行天下 在前两篇文章中,我们介绍了有关nagios的安装与配置,文章为<烂泥:学习Nagios(一):Nagios安装>.<烂泥:学习Nagio ...
- 工作中常用的Linux命令:crontab命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...
- seq
Linux 中seq 命令的用法 用于产生从某个数到另外一个数之间的所有整数 用法: seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 ...