如何从Azure SQL数据库获取表描述

时间:2016-05-07 18:05:05

标签: tsql azure azure-sql-database

对于SQL Server,我可以使用以下方法从元数据中获取表描述:

SELECT 
    OBJECT_SCHEMA_NAME(t.object_id) as SchemaName, 
    t.name AS TableName, 
    ex.value AS Description 
FROM 
    sys.tables AS t,
    sys.extended_properties AS ex 
WHERE 
    ex.major_id = t.object_id 
    AND ex.minor_id = 0 
    AND ex.name = 'MS_Description' 
    AND ex.value IS NOT NULL

但是这会引发一个异常命中Azure SQL数据库。如何从Azure SQL数据库中提取它?

我得到的例外是:

  

发生System.Data.SqlClient.SqlException HResult = -2146232060
  消息=无效的对象名称' sys.extended_properties'。来源=净   SqlClient数据提供程序ErrorCode = -2146232060类= 16
  LineNumber = 1 Number = 208 Procedure =""
  Server = tcp:odjidszumt.database.windows.net State = 1 StackTrace:          在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)          在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject)   stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)          在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj,布尔& dataReady)          在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()          在System.Data.SqlClient.SqlDataReader.get_MetaData()          在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,   RunBehavior runBehavior,String resetOptionsString)          在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean   async,Int32超时,任务& task,Boolean asyncWrite,SqlDataReader   DS)          在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法,TaskCompletionSource`1完成,Int32超时,任务&任务,   布尔asyncWrite)          在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法)          在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior   行为,字符串方法)          在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior   行为)          在System.Data.Common.DbCommand.ExecuteReader()          在net.windward.utils.ado.SqlServer.WrSqlServerDatabase.TableDesc(DbConnection)   conn,String select)in   C:\ VSO \杰诺瓦\队伍\重构\发动机\ DotNetEngine \凯卢阿\网络\迎风\ utils的\结结实实\ SqlServer的\ WrSqlServerDatabase.cs:行   465 InnerException:

我不知道什么版本的Sql数据库 - 我们在Azure上创建了一个Sql数据库,并没有做任何特别的事情,所以我猜测最新的。

2 个答案:

答案 0 :(得分:2)

正式地说,根据this MSDN article,Azure SQL数据库不支持 sys.extended_properties 视图。您提供的错误消息显示" 无效的对象名称' sys.extended_properties' ",这证明它不受支持。 enter image description here

然而,奇怪的是,当我从SSMS和SQL Server对象资源管理器对Azure SQL数据库运行查询时,它可以工作。然后我回到门户网站注意我创建了一个V12 SQL Server,然后尝试创建一个V2 SQL Server并对其运行查询,得到相同的结果" 无效的对象名称' sys.extended_properties' ",见下面的快照:
enter image description here

因此,按照上述测试,我认为' sys.extended_properties'仅在Azure SQL Server V12数据库中受支持。似乎MS官方文章可能没有更新到最新。我建议您检查您创建的Azure SQL数据库的版本:
enter image description here

您可以在创建SQL Server时启用V12,如下所示:
enter image description here

答案 1 :(得分:0)

找到Azure sys表。我需要一个解决方案,在元驱动的etl过程中设置需要区分大小写比较的列。注意:可能希望将d。[Value]字段转换为可获取的元模型。

/*********************************
Returns Table Column Descriptions
*********************************/
Select 
   s.[name] AS SchemaName
  ,t.[name] AS TableName
  ,c.[name] AS ColumnName
  ,d.[value] AS Desription
From sys.schemas AS s
Inner Join sys.sysobjects AS t /* Tables*/
   On t.[uid] = s.[schema_id]
Inner Join sys.syscolumns AS c
   On c.id = t.id
Inner Join sys.extended_properties AS d /*Column Description*/
   On d.major_id = t.id
  And d.minor_id = c.colid
Where d.[name] = 'MS_Description'