生活随笔
收集整理的這篇文章主要介紹了
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 WHERE id = 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 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。