数据字典生成工具之旅(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 ...
随机推荐
- Android简化xml sax解析
dom解析占用内存大(我这边需要解析各种各样的kml文件,有时4-5M的kml文件使用dom解析很多手机就内存溢出了),也需要引入第三方库,所以使用相对于节省内存很多.不需引入其他库的sax解析就是很 ...
- 《Hey程序员 你适合加入创业公司吗?》再补充
笔者经过多年的走访发现,不是所有优秀的程序员都能在创业公司如鱼得水.根据笔者的经验,具备下面几点优秀品质的程序员会更容易适应创业公司的环境. 1.娴熟的调试技巧可以说,程序员的大部分时间都花在调试程序 ...
- knockoutjs with绑定导致unobtrusive validation失效的问题
如果最初的时候with绑定的对象是空的,那么with绑定内部的unobtrusive validation规则在提交的时候无法生效,无法进行验证. 解决办法: 在提交的时候(或者with绑定的对象非空 ...
- SQL Server连接SQL Server、SQL Server连接ORACLE 链接服务器
夸数据库访问有很多种方式,其中部分用作接口访问,这里要介绍的是MSSQL访问另一台MSSQL,MSSQL访问ORACLE,其它暂不介绍. 1.MSSQL访问另一台MSSQL: a.展开服务器对象--& ...
- 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法
不知道有人做没做过对日外包,如果做过的话,那么对vb.net应该非常熟悉了,当年我刚毕业的时候也做过四个月的外包,那种日子简直 不是人过的,就连大楼下面买珠宝的阿姨都说,这些孩子,只看过他们上班,就没 ...
- ES6 Set/WeakSet
ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素.Set实现为一个类,使用时需要先new. var s1 = new Set() s1.add(1) s1.add(2 ...
- hadoop2.6---windows下开发环境搭建
一.准备插件 1.自己编译 1.1 安装Ant 官网下载Ant,apache-ant-1.9.6-bin.zip 配置环境变量,新建ANT_HOME,值是E:\apache-ant-1.9.6:PAT ...
- C 运算符优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -& ...
- jquery——九宫格大转盘抽奖
一.用到的图片 二.代码如下,重点是js部分 <!DOCTYPE html> <html> <head> <meta http-equiv="Con ...
- 微信公众平台C# SDK:Senparc.Weixin.MP.dll
https://github.com/Senparc/WeiXinMPSDK [转] http://www.cnblogs.com/szw/archive/2013/01/13/senparc-wei ...