MS SQL 模仿ORACLE的DESC
前言: 在ORACLE数据库的SQL*PLUS里面有个DES(DESCRIBE)命令,它可以返回数据库所存储对象的描述,如下所示
SQL> DESC STUDENT_SCORE
Name Type Nullable Default Comments
---------------- ---------- -------- ------- --------
STUDENT_NO NUMBER(10) 学号
CHINESE_SCORE NUMBER Y 语文成绩
ENGLISH_SCORE NUMBER Y 英语成绩
MATH_SOCRE NUMBER Y 数学成绩
PHYSICAL_SCORE NUMBER Y 物理成绩
SPORTS_SCORE NUMBER Y 体育成绩
CHEMICAL_SCORE NUMBER Y 化学成绩
BIOLOGICAL_SCORE NUMBER Y 生物成绩
DESC可以获取表、视图等的字段名、字段类型、以及字段注释等信息。在开发过程中,这个命令非常实用,方便,也是使用频率比较高的命令,在MS SQL中没有这个命令,倒是有个sp_help命令,也比较方便,获取的信息甚至比DESC命令还多,但是它有个缺陷,不能获取字段的注释信息,有时候给你来一堆你不想关注的信息。下面我们我们来创建一个存储过程,模拟实现DESC命令的功能以及定制一些你想要的功能。希望这个存储过程能方便大家的工作。初版代码如下:
- SET ANSI_NULLS ON;
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- IF EXISTS(SELECT 1 FROM sysobjects WHEREid=OBJECT_ID(N'sp_desc')
- AND OBJECTPROPERTY(id, 'IsProcedure') =1)
- DROP PROCEDURE sp_desc;
- GO
- --==================================================================================================
- -- ProcedureName : sp_desc
- -- Author : Kerry
- -- CreateDate : 2013-05-13
- -- Blog : www.cnblogs.com/kerrycode/
- -- Description : 模仿ORACLE的SQLPLUS命令DESC,并且参考sp_help相关
- -- 增强功能
- /***************************************************************************************************
- Parameters : 参数说明
- ****************************************************************************************************
- @ObjName : 需要查看的对象名称,例如表名、视图等
- ****************************************************************************************************
- Modified Date Modified User Version Modified Reason
- ****************************************************************************************************
- 2013-05-19 Kerry V01.00.01 增加Print信息,提示输出内容
- ***************************************************************************************************/
- --==================================================================================================
- CREATE PROCEDURE sp_desc
- (
- @ObjName VARCHAR(32)
- )
- AS
- SET NOCOUNT ON;
- DECLARE @ObjectId INT;
- DECLARE @Sysobj_Type CHAR(2);
- IF @ObjName IS NULL
- BEGIN
- PRINT 'you must assign the parameter @ObjNam';
- RETURN 0;
- END
- SELECT @ObjectId = object_id, @Sysobj_Type=type FROM sys.all_objects
- WHERE object_id =OBJECT_ID(@ObjName);
- IF @Sysobj_Type ='U' AND @ObjectId > 0
- BEGIN
- SELECT N'************表的功能描述信息**********' AS N'表的功能描述信息';
- --表的功能描述信息
- SELECT ISNULL(value, '麻烦补齐表的功能描述信息') AS Table_Desc
- FROM sys.extended_properties
- WHERE major_id = @ObjectId
- AND minor_id = 0
- SELECT N'************表结构基本信息************' AS N'表结构基本信息';
- --列出表结构的基本信息
- SELECT C.Name AS Column_Nam ,
- CASE WHEN T.Name = 'nvarchar'
- THEN T.name + '(' + CAST(C.max_length / 2 AS VARCHAR) + ')'
- ELSE T.name
- END AS Data_Type ,
- CASE WHEN C.Max_Length = -1 THEN 'Max'
- ELSE CAST(C.Max_Length AS VARCHAR)
- END AS Max_Length ,
- C.Precision ,
- C.Scale ,
- CASE WHEN C.is_nullable = 0 THEN '×'
- ELSE '√'
- END AS Is_Nullable ,
- ISNULL(CAST(I.seed_value AS VARCHAR) + '-'
- + CAST(I.increment_value AS VARCHAR), '') AS Is_Identity ,
- ISNULL(M.text, '') AS Default_Value ,
- ISNULL(P.value, '') AS Column_Comments
- FROM sys.columns C
- INNER JOIN sys.types T ON C.system_type_id = T.user_type_id
- LEFT JOIN dbo.syscomments M ON M.id = C.default_object_id
- LEFT JOIN sys.extended_properties P ON P.major_id = C.object_id
- AND C.column_id = P.minor_id
- LEFT JOIN sys.identity_columns I ON I.column_id = C.column_id
- AND C.object_id = I.object_id
- WHERE C.[object_id] = @ObjectId
- ORDER BY C.Column_Id ASC;
- SELECT N'**********表约束基本信息************' AS N'表约束基本信息';
- --表的约束信息
- SELECT name ,
- type
- FROM sys.objects
- WHERE parent_object_id = @ObjectId
- AND type IN( 'C ', 'PK', 'UQ', 'F ', 'D ' ) ;
- SELECT N'********表的索引基本信息********' AS N'表的索引基本信息';
- --±表的索引信息
- SELECT i.index_id ,
- i.data_space_id ,
- i.name ,
- CASE WHEN type = 0 THEN '堆'
- WHEN type = 1 THEN '聚集索引'
- WHEN type = 2 THEN '非聚集索引'
- WHEN type = 3 THEN 'XML'
- WHEN TYPE = 4 THEN '空间'
- END AS [type] ,
- i.ignore_dup_key ,
- i.is_unique ,
- i.is_hypothetical ,
- i.is_primary_key ,
- i.is_unique_constraint ,
- s.auto_created ,
- s.no_recompute
- FROM sys.indexes i
- JOIN sys.stats s ON i.object_id = s.object_id
- AND i.index_id = s.stats_id
- WHERE i.object_id = @ObjectId;
- SELECT N'********索引包含那些字段********' AS '索引字段信息';
- SELECT d.name, i.index_id, c.name
- FROM sys.indexes d
- INNER JOIN sys.index_columns i ON d.object_id = i.object_id
- LEFT JOIN sys.columns c ON i.object_id = c.object_id
- AND i.index_column_id = c.column_id
- WHERE d.object_id = @ObjectId;
- SELECT N'********表的触发器基本信息********' AS N'触发器信息';
- --表的触发器信息
- SELECT trigger_name = name ,
- trigger_owner = USER_NAME(OBJECTPROPERTY(object_id, 'ownerid')) ,
- isupdate = OBJECTPROPERTY(object_id, 'ExecIsUpdateTrigger') ,
- isdelete = OBJECTPROPERTY(object_id, 'ExecIsDeleteTrigger') ,
- isinsert = OBJECTPROPERTY(object_id, 'ExecIsInsertTrigger') ,
- isafter = OBJECTPROPERTY(object_id, 'ExecIsAfterTrigger') ,
- isinsteadof = OBJECTPROPERTY(object_id, 'ExecIsInsteadOfTrigger') ,
- trigger_schema = SCHEMA_NAME(schema_id)
- FROM sys.objects
- WHERE parent_object_id = @ObjectId
- AND type IN( 'TR', 'TA' ) ;
- END
- ELSE IF @Sysobj_Type ='V' AND @ObjectId > 0
- BEGIN
- SELECT N'*********视图的功能描述信息**********' AS N'视图的功能描述信息';
- --视图的功能描述信息
- SELECT ISNULL(value, N'麻烦补齐描述该视图功能的信息') AS View_Desc
- FROM sys.extended_properties
- WHERE major_id = @ObjectId
- AND minor_id = 0
- SELECT '*************视图基本信息*****************' AS N'视图基本信息';
- SELECT C.Name AS Column_Nam ,
- CASE WHEN T.Name = 'nvarchar'
- THEN T.name + '(' + CAST(C.max_length / 2 AS VARCHAR) + ')'
- ELSE T.name
- END AS Data_Type ,
- CASE WHEN C.Max_Length = -1 THEN 'Max'
- ELSE CAST(C.Max_Length AS VARCHAR)
- END AS Max_Length ,
- C.Precision ,
- C.Scale ,
- CASE WHEN C.is_nullable = 0 THEN '×'
- ELSE '√'
- END AS Is_Nullable ,
- ISNULL(CAST(I.seed_value AS VARCHAR) + '-'
- + CAST(I.increment_value AS VARCHAR), '') AS Is_Identity ,
- ISNULL(M.text, '') AS Default_Value ,
- ISNULL(P.value, '') AS Column_Comments
- FROM sys.columns C
- INNER JOIN sys.types T ON C.system_type_id = T.user_type_id
- LEFT JOIN dbo.syscomments M ON M.id = C.default_object_id
- LEFT JOIN sys.extended_properties P ON P.major_id = C.object_id
- AND C.column_id = P.minor_id
- LEFT JOIN sys.identity_columns I ON I.column_id = C.column_id
- AND C.object_id = I.object_id
- WHERE C.[object_id] = @ObjectId
- ORDER BY C.Column_Id ASC;
- SELECT '**********视图脚本***********' AS '视图脚本';
- EXEC sp_helptext @ObjName;
- END
- ELSE IF @Sysobj_Type ='P' AND @ObjectId > 0
- BEGIN
- SELECT N'*********描述存储过程功能信息**********' AS N'描述存储过程功能信息';
- --存储过程的功能描述信息
- SELECT ISNULL(value, N'麻烦补齐描述该存储过程功能的信息') AS View_Desc
- FROM sys.extended_properties
- WHERE major_id = @ObjectId
- AND minor_id = 0;
- EXEC sp_help @ObjName;
- END
- ELSE IF @Sysobj_Type IN('IF') AND @ObjectId > 0
- BEGIN
- SELECT N'*********描述自定义函数功能信息**********' AS N'描述自定义函数功能信息';
- --描述自定义函数功能信息
- SELECT ISNULL(value, N'麻烦补齐描述该自定义函数功能的信息') AS View_Desc
- FROM sys.extended_properties
- WHERE major_id = @ObjectId
- AND minor_id = 0;
- SELECT 'Name' = o.name ,
- 'Owner' = USER_NAME(OBJECTPROPERTY(object_id, 'ownerid')) ,
- 'Object_type' = SUBSTRING(v.name, 5, 31)
- FROM sys.all_objects o ,
- master.dbo.spt_values v
- WHERE o.object_id =@ObjectId AND o.type = SUBSTRING(v.name, 1, 2) COLLATE database_default
- AND v.type = 'O9T'
- ORDER BY [Owner] ASC ,
- Object_type DESC ,
- Name ASC
- END
- GO
接下来,我们新建一张表来看看效果如何,视图,存储过程、自定义函数就不大战篇幅去展示了,一个例子就OK了,有兴趣的,自己试试
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'Employee') AND type='U')
DROP TABLE dbo.Employee;
GO
CREATE TABLE Employee
(
Employee_ID INT IDENTITY(1,1) ,
Employee_Name NVARCHAR(12) ,
Sex SMALLINT DEFAULT(1),
Department_ID INT ,
Salary FLOAT ,
WorkYear INT ,
CONSTRAINT PK_Employee PRIMARY KEY(Employee_ID)
);
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'员工编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'Employee_ID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'员工姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'Employee_Name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'性别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'Sex'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'部门编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'Department_ID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'薪水' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'Salary'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'工龄' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee', @level2type=N'COLUMN',@level2name=N'WorkYear'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'员工信息表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Employee'
CREATE TRIGGER TR_Employee_Salary ON Employee
AFTER INSERT
AS
DECLARE @Salary FLOAT;
SELECT @Salary = Salary FROM INSERTED;
IF (@Salary < 0)
BEGIN
RAISERROR('The Salary Small than 0 ',10,1);
ROLLBACK TRANSACTION;
END
GO
CREATE VIEW V_Employee
AS
SELECT Employee_ID, Employee_Name, WorkYear FROM Employee
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'员工信息表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'V_Employee'
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'给用户批量赋权限的存储过程' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'sp_authorize_right'
执行存储过程,你可以获取表Employee的基本信息了,如下所示
转载于:https://www.cnblogs.com/kerrycode/archive/2013/05/21/3091911.html
MS SQL 模仿ORACLE的DESC相关推荐
- oledb连接mysql_OLEDB 连接 和 效率(MS SQL 、Oracle 、ACESS)
这半年手头的一个项目,自己写代码的时候偏爱 MS SQL.部署服务器装的是 ORALCE 和 实际的现场是小型机,压根没有装数据库只好选用 ACESS ,三种环境不一致,才决定用 OLEDB 做数据库 ...
- Oracle 9i与MS SQL Server 2000之比较连载五.zz
http://kb.cnblogs.com/a/1153156 Oracle 9i与MS SQL Server 2000之比较连载五 2008-04-14 18:13 四.Oracle中新的数据库对象 ...
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 Xml代码 <!-- O ...
- Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新
一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS S ...
- 关于64位 MS SQL 导入导出 Oracle 引发 ORA-06413 的解决方法
如果在X64系统下我们想利用 MS SQL 的DTS导入导出 Oracle 数据,由 oracle 不支持路径中包含")",会引发 ORA-06413:连接未打开错误 解决的办法很 ...
- oracle忘记实例名,Oracle的安装和MS SQL Server实例名
Oracle 初始密码: internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_temp 最后一个用户 ...
- ibatis中主键自动增长(Oracle,Ms sql server ,mysql)
http://morning2008.iteye.com/blog/611528 iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pr ...
- sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段
在Oracle.MySQL.MS SQL Server中创建自动增长字段 好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题... 一:Oracle Orac ...
- sql server配置连接oracle数据库,MS SQL Server连接Oracle
MS SQL Server连接Oracle 1. 安装oracle 10G客户端 要访问oracle数据库必须安装oracle客户端.安装oracle客户端有两种方式,即完整安装和立即安装,这两种方 ...
最新文章
- php javascript wav波形绘制,PHP分析.wav文件并绘制png格式的波形图
- lazada店铺成长案例分享!把握小众类目商机,店铺月销过万单!
- python如何运用ols_使用OLS回归(Python,StatsModels,Pandas)预测未来值
- maven 国内私服
- 让我们一起Go(九)
- 音频编码:ADPCM
- 检测文件是否有BOM 头,并删除BOM头(php)
- 格力关联公司公开“菜谱的推荐方法”相关专利
- c语言 strupr,C语言 strupr()用法及代码示例
- 51nod 1134最长递增子序列
- 共享单车为什么这么重?
- iOS启动画面不更新的问题
- JavaWeb的环境配置
- 清理c盘、c盘哪些文件可以删、图形显示文件大小软件
- 【读书笔记】重新定义团队
- 人工智能Java SDK:图片分类(支持imagenet数据集分类)
- Delphi医保支付【支持重庆,湖南,湖北,河南,江苏,黑龙江,吉林等医保接口】
- 发送给客户的文件,怕泄漏怎么办?
- 【obs】发送前丢帧算法及帧优先级设置
- Kubernetes 之 YAML 语法
热门文章
- hadoop初始化(hdfs格式化)+简单测试(转载+自己整理)
- (error) ERR wrong number of arguments for 'hmget' command
- 利用sshfs+任意本地编辑器编辑远程文件
- colab加载google drive并且调试时跳过不运行
- ubuntu的codelite中代码运行后出现/usr/bin/codelite_exec: 22: /usr/bin/codelite_exec
- 5.2 最优近似解 $\mathbf{\hat{x}} = A^{-1}_L\mathbf{b}$ 是最小二乘解
- mysql 全局select授权_MySQL的用户设置与授权
- Runnable和Thread基础---多线程学习笔记(二)
- CCNA--增强型内部网关路由选择协议(EIGRP)
- 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话