对于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,Action1 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数据库,并没有做任何特别的事情,所以我猜测最新的。
答案 0 :(得分:2)
正式地说,根据this MSDN article,Azure SQL数据库不支持 sys.extended_properties 视图。您提供的错误消息显示" 无效的对象名称' sys.extended_properties' ",这证明它不受支持。
然而,奇怪的是,当我从SSMS和SQL Server对象资源管理器对Azure SQL数据库运行查询时,它可以工作。然后我回到门户网站注意我创建了一个V12 SQL Server,然后尝试创建一个V2 SQL Server并对其运行查询,得到相同的结果" 无效的对象名称' sys.extended_properties' ",见下面的快照:
因此,按照上述测试,我认为' sys.extended_properties'仅在Azure SQL Server V12数据库中受支持。似乎MS官方文章可能没有更新到最新。我建议您检查您创建的Azure SQL数据库的版本:
答案 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'