上一篇代码生成工具里面已经用到了读取表结构的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 视图
 
 5.sp_helptext(查看函数,视图,存储过程创建语句的系统存储过程)
  知道一个存储过程名称,如何找到这个存储过程的创建语句呢,别着急这个时候sp_helptext派上用场了,请看下面SQL,其中fn_Spilt为函数名称

sp_helptext fn_Spilt

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

 

实际应用

介绍完上面几个重要的视图以后,这里介绍一下这些视图的实际作用。

  1. 创建可重复执行的语句
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 来进行查询。

工具源代码下载

目前总共有经过了七个版本的升级,现在提供最新版本的下载地址

学习使用

如果你使用了该工具,或者想学习该工具,欢迎加入这个小组,一起讨论数据字典生成工具、把该工具做的更强,更方便使用,一起加入147425783 QQ群

      更多数据字典生成工具资料请点击数据字典生成工具专题

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

如果,想给予我更多的鼓励,求打

因为,我的写作热情也离不开您的肯定支持。

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是焰尾迭 。

数据字典生成工具之旅(8):SQL查询表的约束默认值等信息的更多相关文章

  1. 数据字典生成工具之旅(5):DocX组件读取与写入Word

    由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocity篇,到时会讲解怎么使用NVelocity做一款简易的代码生成器,敬请期待!),好了正式进入本篇内容. 这 ...

  2. 数据字典生成工具之旅(3):PowerDesign文件组成结构介绍及操作

    从这篇开始将正式讲解整个重要部分的实现细节,本篇讲解Pdm文件的解析.其实PDM文件就是XML文件,可以用Editplus或者VS打开查看.了解到这一点之后大家就能猜到,可以用解析XML的方式读取PD ...

  3. 数据字典生成工具之旅(4):NPOI操作EXECL

    这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的 ...

  4. 数据字典生成工具之旅(6):NVelocity语法介绍及实例

    本章开始将会为大家讲解NVelocity的用法,并带领大家实现一个简单的代码生成器. NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语 ...

  5. 数据字典生成工具之旅(7):NVelocity实现代码生成器

    这个系统好久没有更新了,人也慢慢变懒了,从现在开始每个月至少写三篇文章,欢迎大家监督.对了预告一下,该系列完成以后将为大家带来WebApp开发系列篇,敬请期待.先上几张图,放在文章最后面欢迎预览! 本 ...

  6. 数据字典生成工具(生成Excel, Word,PDF,html)

    转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...

  7. SQL Server date 设置默认值

    根据时间做数据统计计算最讨厌开始和结束时间字段是NULL,为了处理NULL要写很多语句. 那么在数据库设计的时候给一个默认值:0001-01-01和9999-12-31,会给开发人员带来很大的便利. ...

  8. oracle 以及 sql server mysql 空值默认值修改

    在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...

  9. SQL 添加字段和默认值脚本

    --插入字段和默认值alter table Acc_WayBill add DeclaredValue nvarchar(50)goEXEC sys.sp_addextendedproperty @n ...

随机推荐

  1. go sync.Mutex 设计思想与演化过程 (一)

    go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰.学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库.最好的办法就是将整个源代码读一遍,这是我见过最简洁的系统类 ...

  2. Java并发之ScheduledExecutorService(schedule、scheduleAtFixedRate、scheduleWithFixedDelay)

    package com.thread.test.thread; import java.util.Timer; import java.util.TimerTask; import java.util ...

  3. Dubbo 分布式服务框架(spring、zookeeper)

    DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...

  4. 编写Java应用程序。首先,定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时、分、秒,一个构造方法用于对三个成员变量(时、分、秒) 进行初始化,还有一个成员方法show()用于显示时钟对象的时间。其次,再定义 一个主类——TestClass,在主类的main方法中创建多个时钟类的对象,使用这 些对象调用方法show()来显示时钟的时间。

    package com.hanqi.test; public class Clock { int hh; int mm; int ss; String time; Clock(int h,int m, ...

  5. Java Dom解析的三个实例

    概述 Dom解析的文章已经烂大街了.在这里,只举三个场景下如何编码的例子: xml内有多个同名节点,获取这多个同名节点 已获取到某个节点,生成这个节点的xml描述 修改节点某属性的值 详细的讲解看官请 ...

  6. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  7. JAVA-android 更改APP名称与图标

    首先要在你的资源文件放入你想换的图标图片拖到drawable-XX文件夹下,然后你打开AndroidManifest.xml这个配置清单文件找到application标签里的这句android:ico ...

  8. Hyper-V架构与VMware ESXi的差异

    微软的Hyper-V与VMware的ESXi在架构上有众多不同,然而很多虚拟化管理员并未意识到这些差异.而且很多管理员同样对Hyper-V是在主机操作系统上运行感到困惑. 有关微软Hyper-V的一个 ...

  9. 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  10. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...