如何从SQL Server数据库表中读取元数据?
我是SQL Server的完全初学者。我得到了一个SQL Server备份文件格式的数据库。我知道了如何恢复数据库,但现在我希望导出表(最终导出到Stata.dta文件) 我对如何查看和提取SQL Server数据库可能包含的任何元数据感到困惑。例如,我有一列标记为如何从SQL Server数据库表中读取元数据?,sql,sql-server,database,metadata,Sql,Sql Server,Database,Metadata,我是SQL Server的完全初学者。我得到了一个SQL Server备份文件格式的数据库。我知道了如何恢复数据库,但现在我希望导出表(最终导出到Stata.dta文件) 我对如何查看和提取SQL Server数据库可能包含的任何元数据感到困惑。例如,我有一列标记为Sex,值为1和2。然而,我不知道哪个数字是指男性,哪个数字是指女性。如何查看列描述(如果存在)以查看是否有任何标签可以澄清此问题 编辑:快速提问。如果我使用导入/导出向导,它会自动提取元数据吗?这是迄今为止从SQL导出到excel的
Sex
,值为1和2。然而,我不知道哪个数字是指男性,哪个数字是指女性。如何查看列描述(如果存在)以查看是否有任何标签可以澄清此问题
编辑:快速提问。如果我使用导入/导出向导,它会自动提取元数据吗?这是迄今为止从SQL导出到excel的最佳帖子: 要将数据导出到带有标题(列名)的新EXCEL文件中,请创建以下过程
create procedure proc_generate_excel_with_columns
(
@db_name varchar(100),
@table_name varchar(100),
@file_name varchar(100)
)
as
--Generate column names as a recordset
declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)
select
@columns=coalesce(@columns+',','')+column_name+' as '+column_name
from
information_schema.columns
where
table_name=@table_name
select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''')
--Create a dummy file to have actual data
select @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.xls'
--Generate column names in the passed EXCEL file
set @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c'''
exec(@sql)
--Generate data in the dummy file
set @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c'''
exec(@sql)
--Copy dummy file to passed EXCEL file
set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
exec(@sql)
--Delete dummy file
set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
exec(@sql)
创建过程后,通过提供数据库名、表名和文件路径来执行该过程
EXEC proc_generate_excel_with_columns 'your dbname', 'your table name','your file path'
如果您的数据库管理员和/或开发人员使用了所谓的扩展属性来记录数据库表,那么您可以使用以下T-SQL语句检索这些描述:
SELECT
TableName = t.Name,
ColumnName = c.Name,
ep.class_desc,
ep.value
FROM
sys.extended_properties ep
INNER JOIN
sys.tables t ON ep.major_id = t.object_id
INNER JOIN
sys.columns c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
它使用一些SQL Server目录视图(
sys.tables
等),其中包含有关SQL Server数据库对象的所有有价值的元数据信息 假设您有正确的外键,您可以使用以下T-SQL搜索引用的列:
SELECT constraint_object_name
, constraint_object_name
, referenced_object_name
, referenced_column_name
FROM (
SELECT Object_Name(parent_object_id) As constraint_object_name
, constraint_columns.name As constraint_column_name
, Object_Name(referenced_object_id) As referenced_object_name
, referenced_columns.name As referenced_column_name
FROM sys.foreign_key_columns
INNER
JOIN sys.columns As constraint_columns
ON constraint_columns.object_id = foreign_key_columns.parent_object_id
AND constraint_columns.column_id = foreign_key_columns.parent_column_id
INNER
JOIN sys.columns As referenced_columns
ON referenced_columns.object_id = foreign_key_columns.referenced_object_id
AND referenced_columns.column_id = foreign_key_columns.referenced_column_id
) As foreign_key_details
WHERE 'SearchingForThisColumnHere' IN (constraint_column_name, referenced_column_name)
只需搜索共享名称的列
SELECT Object_Name(object_id) As object_name
, name As column_name
FROM sys.columns
WHERE name = 'SearchingForThisColumnHere'
谢谢你的帮助!这是非常有用的,虽然因为我实际上是一个完全的初学者,我不完全理解这个解决方案。我是否必须用我的特定值替换所有以@开头的条目?例如,对于@db_name,我是否将其替换为实际的数据库名称?此外,这是否也会将表中的元数据导出到Excel?是的,您必须用特定值替换以@开头的所有条目。此脚本将帮助您将元数据和表导出到ExcelI see。太好了,谢谢你的帮助,我会试试的!当替换为特定值时,我是直接键入名称还是应该知道具体的语法?您可以在这个类似的答案中找到更多信息。在启动脚本之前,您必须阅读所有步骤并设置所有变量。您可以选择我的答案作为正确答案吗?谢谢!:)你好谢谢你的帮助。我道歉,因为我实际上是一个完全的初学者。那么我可以打开一个新的查询并复制粘贴它吗?或者我必须将t.Name更改为我的表名吗?@Vincent:打开一个查询窗口,确保您在正确的数据库中,然后执行此t-SQL语句。还有一个快速问题。如果我使用导入/导出向导,它会自动提取元数据吗?谢谢你的帮助!