日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MS SQL 模仿ORACLE的DESC

發布時間:2023/12/19 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • ???
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。