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命令的功能以及定制一些你想要的功能。希望这个存储过程能方便大家的工作。初版代码如下: 

sp_desc

  1.    
  2. SET ANSI_NULLS ON;
  3. GO
  4.  
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7.  
  8.   IF  EXISTS(SELECT 1 FROM sysobjects WHEREid=OBJECT_ID(N'sp_desc')
  9.                       AND OBJECTPROPERTY(id, 'IsProcedure') =1)
  10.     DROP PROCEDURE sp_desc;
  11. GO
  12.  
  13. --==================================================================================================
  14. --            ProcedureName            :            sp_desc
  15. --            Author                   :            Kerry
  16. --            CreateDate               :            2013-05-13
  17. --            Blog                     :            www.cnblogs.com/kerrycode/
  18. --            Description              :            模仿ORACLE的SQLPLUS命令DESC,并且参考sp_help相关
  19. --                                                  增强功能
  20. /***************************************************************************************************
  21.         Parameters                    :             参数说明
  22. ****************************************************************************************************
  23.             @ObjName                  :            需要查看的对象名称,例如表名、视图等
  24. ****************************************************************************************************
  25.         Modified Date            Modified User     Version            Modified Reason
  26. ****************************************************************************************************
  27.        2013-05-19                Kerry             V01.00.01        增加Print信息,提示输出内容
  28. ***************************************************************************************************/
  29. --==================================================================================================
  30. CREATE PROCEDURE sp_desc
  31. (
  32.     @ObjName        VARCHAR(32)
  33. )
  34. AS
  35.  
  36. SET NOCOUNT ON;
  37.  
  38. DECLARE @ObjectId        INT;
  39. DECLARE @Sysobj_Type    CHAR(2);
  40.  
  41. IF @ObjName IS NULL
  42.     BEGIN
  43.         PRINT 'you must assign the parameter @ObjNam';
  44.         
  45.         RETURN 0;
  46.     END
  47.  
  48.  
  49. SELECT @ObjectId = object_id, @Sysobj_Type=type FROM sys.all_objects
  50.     WHERE object_id =OBJECT_ID(@ObjName);
  51.     
  52. IF @Sysobj_Type ='U' AND @ObjectId > 0
  53. BEGIN
  54.     
  55.                 
  56.         SELECT N'************表的功能描述信息**********' AS N'表的功能描述信息';
  57.         
  58.         --表的功能描述信息
  59.         SELECT    ISNULL(value, '麻烦补齐表的功能描述信息') AS Table_Desc
  60.         FROM      sys.extended_properties
  61.         WHERE     major_id = @ObjectId
  62.             AND minor_id = 0
  63.          
  64.         SELECT N'************表结构基本信息************' AS N'表结构基本信息';
  65.            
  66.         --列出表结构的基本信息
  67.         SELECT  C.Name AS Column_Nam ,
  68.                 CASE WHEN T.Name = 'nvarchar'
  69.                      THEN T.name + '(' + CAST(C.max_length / 2 AS VARCHAR) + ')'
  70.                      ELSE T.name
  71.                 END AS Data_Type ,
  72.                 CASE WHEN C.Max_Length = -1 THEN 'Max'
  73.                      ELSE CAST(C.Max_Length AS VARCHAR)
  74.                 END AS Max_Length ,
  75.                 C.Precision ,
  76.                 C.Scale     ,
  77.                 CASE WHEN C.is_nullable = 0 THEN '×'
  78.                      ELSE '√'
  79.                 END AS Is_Nullable ,
  80.                 ISNULL(CAST(I.seed_value AS VARCHAR) + '-'
  81.                        + CAST(I.increment_value AS VARCHAR), '') AS Is_Identity ,
  82.                 ISNULL(M.text, '') AS Default_Value ,
  83.                 ISNULL(P.value, '') AS Column_Comments
  84.         FROM    sys.columns C
  85.                 INNER JOIN sys.types T ON C.system_type_id = T.user_type_id
  86.                 LEFT  JOIN dbo.syscomments M ON M.id = C.default_object_id
  87.                 LEFT  JOIN sys.extended_properties P ON P.major_id = C.object_id
  88.                                                         AND C.column_id = P.minor_id
  89.                 LEFT  JOIN sys.identity_columns I ON I.column_id = C.column_id
  90.                                                      AND C.object_id = I.object_id
  91.         WHERE   C.[object_id] = @ObjectId
  92.         ORDER BY C.Column_Id ASC;
  93.         
  94.         SELECT N'**********表约束基本信息************' AS N'表约束基本信息';
  95.         
  96.         --表的约束信息
  97.           SELECT    name ,
  98.                     type
  99.           FROM      sys.objects
  100.           WHERE     parent_object_id = @ObjectId
  101.                     AND type IN( 'C ', 'PK', 'UQ', 'F ', 'D ' ) ;
  102.         
  103.         
  104.         SELECT N'********表的索引基本信息********' AS N'表的索引基本信息';
  105.         
  106.           --±表的索引信息
  107.           SELECT    i.index_id ,
  108.                     i.data_space_id ,
  109.                     i.name ,
  110.                     CASE WHEN type = 0 THEN '堆'
  111.                          WHEN type = 1 THEN '聚集索引'
  112.                          WHEN type = 2 THEN '非聚集索引'
  113.                          WHEN type = 3 THEN 'XML'
  114.                          WHEN TYPE = 4 THEN '空间'
  115.                     END AS [type] ,
  116.                     i.ignore_dup_key ,
  117.                     i.is_unique ,
  118.                     i.is_hypothetical ,
  119.                     i.is_primary_key ,
  120.                     i.is_unique_constraint ,
  121.                     s.auto_created ,
  122.                     s.no_recompute
  123.           FROM      sys.indexes i
  124.                     JOIN sys.stats s ON i.object_id = s.object_id
  125.                                         AND i.index_id = s.stats_id
  126.           WHERE     i.object_id = @ObjectId;
  127.   
  128.           SELECT N'********索引包含那些字段********' AS '索引字段信息';
  129.             
  130.           SELECT  d.name, i.index_id, c.name
  131.             FROM   sys.indexes d
  132.                 INNER JOIN    sys.index_columns i ON d.object_id = i.object_id
  133.                     LEFT JOIN sys.columns c ON i.object_id = c.object_id
  134.                                                AND i.index_column_id = c.column_id
  135.             WHERE   d.object_id = @ObjectId;
  136.         
  137.         
  138.          SELECT N'********表的触发器基本信息********' AS N'触发器信息';
  139.         --表的触发器信息
  140.         
  141.         SELECT  trigger_name = name ,
  142.                 trigger_owner = USER_NAME(OBJECTPROPERTY(object_id, 'ownerid')) ,
  143.                 isupdate = OBJECTPROPERTY(object_id, 'ExecIsUpdateTrigger') ,
  144.                 isdelete = OBJECTPROPERTY(object_id, 'ExecIsDeleteTrigger') ,
  145.                 isinsert = OBJECTPROPERTY(object_id, 'ExecIsInsertTrigger') ,
  146.                 isafter = OBJECTPROPERTY(object_id, 'ExecIsAfterTrigger') ,
  147.                 isinsteadof = OBJECTPROPERTY(object_id, 'ExecIsInsteadOfTrigger') ,
  148.                 trigger_schema = SCHEMA_NAME(schema_id)
  149.         FROM      sys.objects
  150.         WHERE     parent_object_id = @ObjectId
  151.                 AND type IN( 'TR', 'TA' ) ;
  152.     
  153. END
  154. ELSE IF @Sysobj_Type ='V' AND @ObjectId > 0
  155. BEGIN
  156.  
  157.     SELECT N'*********视图的功能描述信息**********'  AS N'视图的功能描述信息';
  158.     
  159.     --视图的功能描述信息
  160.     SELECT    ISNULL(value, N'麻烦补齐描述该视图功能的信息') AS View_Desc
  161.     FROM      sys.extended_properties
  162.     WHERE     major_id = @ObjectId
  163.         AND minor_id = 0
  164.             
  165.     SELECT '*************视图基本信息*****************' AS N'视图基本信息';
  166.     
  167.     SELECT  C.Name AS Column_Nam ,
  168.             CASE WHEN T.Name = 'nvarchar'
  169.                  THEN T.name + '(' + CAST(C.max_length / 2 AS VARCHAR) + ')'
  170.                  ELSE T.name
  171.             END AS Data_Type ,
  172.             CASE WHEN C.Max_Length = -1 THEN 'Max'
  173.                  ELSE CAST(C.Max_Length AS VARCHAR)
  174.             END AS Max_Length ,
  175.             C.Precision ,
  176.             C.Scale     ,
  177.             CASE WHEN C.is_nullable = 0 THEN '×'
  178.                  ELSE '√'
  179.             END AS Is_Nullable ,
  180.             ISNULL(CAST(I.seed_value AS VARCHAR) + '-'
  181.                    + CAST(I.increment_value AS VARCHAR), '') AS Is_Identity ,
  182.             ISNULL(M.text, '') AS Default_Value ,
  183.             ISNULL(P.value, '') AS Column_Comments
  184.     FROM    sys.columns C
  185.             INNER JOIN sys.types T ON C.system_type_id = T.user_type_id
  186.             LEFT  JOIN dbo.syscomments M ON M.id = C.default_object_id
  187.             LEFT  JOIN sys.extended_properties P ON P.major_id = C.object_id
  188.                                                     AND C.column_id = P.minor_id
  189.             LEFT  JOIN sys.identity_columns I ON I.column_id = C.column_id
  190.                                                  AND C.object_id = I.object_id
  191.     WHERE   C.[object_id] = @ObjectId
  192.     ORDER BY C.Column_Id ASC;
  193.     
  194.     SELECT '**********视图脚本***********' AS '视图脚本';
  195.     
  196.     EXEC sp_helptext @ObjName;
  197.     
  198.     
  199. END
  200. ELSE IF @Sysobj_Type ='P' AND @ObjectId > 0
  201. BEGIN
  202.     SELECT N'*********描述存储过程功能信息**********'  AS N'描述存储过程功能信息';
  203.     
  204.     --存储过程的功能描述信息
  205.     SELECT    ISNULL(value, N'麻烦补齐描述该存储过程功能的信息') AS View_Desc
  206.     FROM      sys.extended_properties
  207.     WHERE     major_id = @ObjectId
  208.         AND minor_id = 0;
  209.         
  210.     EXEC sp_help  @ObjName;
  211. END
  212.  
  213. ELSE IF @Sysobj_Type IN('IF') AND @ObjectId > 0
  214. BEGIN
  215.  
  216.         SELECT N'*********描述自定义函数功能信息**********'  AS N'描述自定义函数功能信息';
  217.     
  218.         --描述自定义函数功能信息
  219.         SELECT    ISNULL(value, N'麻烦补齐描述该自定义函数功能的信息') AS View_Desc
  220.         FROM      sys.extended_properties
  221.         WHERE     major_id = @ObjectId
  222.             AND minor_id = 0;
  223.         
  224.         
  225.         SELECT  'Name' = o.name ,
  226.                 'Owner' = USER_NAME(OBJECTPROPERTY(object_id, 'ownerid')) ,
  227.                 'Object_type' = SUBSTRING(v.name, 5, 31)
  228.         FROM    sys.all_objects o ,
  229.                 master.dbo.spt_values v
  230.         WHERE  o.object_id =@ObjectId AND  o.type = SUBSTRING(v.name, 1, 2) COLLATE database_default
  231.                 AND v.type = 'O9T'
  232.         ORDER BY [Owner] ASC ,
  233.                 Object_type DESC ,
  234.                 Name ASC
  235. END
  236.  
  237. 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的基本信息了,如下所示

时间: 2024-09-13 14:30:54

MS SQL 模仿ORACLE的DESC的相关文章

JSP连接MySql/MS SQL Server/Oracle数据库连接方法[整理]_JSP编程

JSP连接MySql数据库方法 首先先将MySql的数据库连接驱动拷贝到Tomcat/common/lib包下 下载mysql-connector-java-5.1.6.zip http://mysql.cs.pu.edu.tw/Downloads/Connector-J/mysql-connector-java-5.1.6.zip 配置Tomcat的虚拟目录-略 创建jdbcMySql.jsp页面 页面代码如下: 复制代码 代码如下: <%@ page contentType="text

MS SQL 日常维护管理常用脚本(一)

  SQL SERVER 数据库日常维护,管理,巡检过程中你可能经常需要用到一些SQL语句(亦或方法)来查看数据库服务器环境(操作系统版本, 磁盘空间,CPU,RAM信息),数据库信息(数据库版本,实例名称...),数据库对象等. 查看数据库信息   查看数据库服务器名称   方法1:SQL脚本查询,可以通过下面脚本来查询.   默认实例 默认实例查询 SELECT @@SERVERNAME AS SERVERNAME;  SELECT SERVERPROPERTY('servername')

利用MS SQL实现异构数据库的分布式查询的t-sql代码

分布式|数据|数据库         /*利用MS SQL实现异构数据库的分布式查询的t-sql代码*/ exec sp_addlinkedserver  'MS_SQL','','SQLOLEDB','172.18.9.20'exec sp_addlinkedsrvlogin 'MS_SQL','false',null,'Sa','capec' /*创建一个sqlserver对sqlserver的数据库远程链接*/ exec sp_addlinkedserver 'ora', 'Oracle'

Oracle数据库向MS Sql表结构及数据如何迁移?

问题描述 新来的经理三把火了,要我们把数据库改了,可是我们没有数据库迁移的经验,网上的博客都是模棱两可的.请教下各位大牛.Oracle数据库向MS Sql2000表结构及数据如何迁移?我们使用了DTS但是提示"未知错误",就不得不中断,请问数据库迁移还有别的办法吗?或者这种未知错误有解? 解决方案 参考http://www.sql-server-performance.com/2003/migrating-from-oracle-to-sql-server/我其实为吐槽来的.Oracl

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)_oracle

Oracle查询结果集,随机排序 复制代码 代码如下: select * from table1 order by dbms_random.value(); MySQL随机查询出一条记录: 复制代码 代码如下: -- 下面的查询语句效率高,不要使用 SELECT * FROM table1 ORDER BY rand() LIMIT 1 来查询 SELECT * FROM table1 WHERE id=(SELECT id FROM table1 ORDER BY rand() LIMIT 1

MS SQL Server数据库查询优化及分页算法

server|分页|数据|数据库|算法|优化 探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的"红头文件"一表的部分数据结构:CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名    [Gid] [int] IDENTITY (1, 1) NOT NULL ,--本表的id号,也是主键    [title] [varchar] (80) COLLATE

榨干MS SQL Server 最后一滴血

server 风云变换的网络,网络安全让人们不能不关注它.数据库,让我们不得不想起强大的ORACLE,MS SQL.微软的漏洞最多,今天就用SQL INJECTION来让MS SQL为我们好好的工作. 以下(使用一知名网站作为测试点),相信大家对SQL爆库,爆表,爆字段都已掌握,在这里就不多说这方面了. MS SQL内置函数介绍: @@VERSION 获得Windows的版本号,MS SQL的版本号,补丁. User_name() 得到当前系统的连接用户 Db_name() 得到当前连接的数据库

MS SQL 监控数据/日志文件增长

  前几天,在所有数据库服务器部署了监控磁盘空间的存储过程和作业后(MS SQL 监控磁盘空间告警), 今天突然收到了两封告警邮件,好吧,存储规划是一方面,但是,是不是要分析一下是什么原因造成磁盘空间不足的呢?会不会是因为突然暴增的日志文件,抑或是 系统业务猛增导致数据量暴增,还是历史数据累计原因....分析总得有数据来支撑吧,但是现在只有那些数据文件的当前大小信息,没有数据文件的历史增长变 化信息,所以,今天就想实现这么一个功能,每天(频率可以调整)去收集一下数据文件的信息,放到一个表里面,这