Tsql SQL Server 2008 R2中某列的元数据?
我正试图找到一种方法来存储有关列的元数据,而不必重复我自己 我目前正在处理一个通用维度加载SSIS包,该包将处理我的所有维度。它目前有: 创建一个与参数中给定表名相同的临时表这是一个通用存储过程,将表名作为参数接收,然后执行以下操作:从[INSERT ORIGINAL table name HERE]中选择top 0*插入[INSERT ORIGINAL table name HERE]。 ==>在这里,我们为这个特定维度插入自定义代码,它将首先从数据源查询数据并获取我的增量,然后转换数据,最后将其加载到我的临时表中。 使用T-SQL合并将临时表合并到我的原始表中,并相应地处理type1和type2字段。 我现在的问题是,我必须维护一个包含所有字段的表来存储元数据,以告诉我的脚本这个特定字段是type1还是type2。。。这是胡说八道,我可以从sys.columns/sys.types获得减去type1/type2的相同数据 我最终考虑重命名我的字段以将其类型包含在其中,例如: 名字,姓氏,性,我知道这可能是第二种,我们不要在这里争论 你认为guyz会怎么做?我使用带有该元数据的表的解决方案目前已经到位并正在运行,但很明显,将我自己从SYSTABLE复制到自定义表是毫无意义的,只是为了一个简单的type1/type2信息Tsql SQL Server 2008 R2中某列的元数据?,tsql,sql-server-2008,ssis,Tsql,Sql Server 2008,Ssis,我正试图找到一种方法来存储有关列的元数据,而不必重复我自己 我目前正在处理一个通用维度加载SSIS包,该包将处理我的所有维度。它目前有: 创建一个与参数中给定表名相同的临时表这是一个通用存储过程,将表名作为参数接收,然后执行以下操作:从[INSERT ORIGINAL table name HERE]中选择top 0*插入[INSERT ORIGINAL table name HERE]。 ==>在这里,我们为这个特定维度插入自定义代码,它将首先从数据源查询数据并获取我的增量,然后转换数据,最后
更新:我还考虑过创建用户定义的类型,比如varchar=>t1\u varchar、t2\u varchar等等。这听起来也有点慢…您需要的所有东西都应该已经准备好了 我无法理解您不使用提供的表/视图的想法
编辑:正如scarpacci提到的,如果需要的话,这有点便携。我知道这不好,但我会发布我自己问题的答案。。。感谢GBN的帮助 我现在在我的列的描述字段中存储标志。一、 例如,可以通过以下方式存储标志:键入_2_数据 然后,我使用此查询返回每个列的标志:
select columns.name as [column_name]
,types.name as [type_name]
,extended_properties.value as [column_flags]
from sys.columns
inner join sys.types
on columns.system_type_id = types.system_type_id
left join sys.extended_properties
on extended_properties.major_id = columns.object_id
and extended_properties.minor_id = columns.column_id
and extended_properties.name = 'MS_Description'
where object_id = ( select id from sys.sysobjects where name = 'DimDivision' )
and is_identity = 0
order by column_id
现在我可以存储关于列的元数据,而无需创建单独的表。我使用已经存在的东西,我不会重复我自己。我不确定这是否是最好的解决方案,但它确实有效,而且比复制信息要好得多
将来,我将能够使用此字段存储更多元数据,其中包括:键入_2_DATA |另一个_标志|等等|哦,天哪
更新:
现在,我将信息存储在单独的扩展属性中。您可以使用sp_addextendedproperty和sp_updateextendedproperty存储过程管理扩展属性。我创建了一个简单的存储过程,帮助我更新这些值,无论它们当前是否存在:
create procedure [dbo].[UpdateSCDType]
@tablename nvarchar(50),
@fieldname nvarchar(50),
@scdtype char(1),
@dbschema nvarchar(25) = 'dbo'
as
begin
declare @already_exists int;
if ( @scdtype = '1' or @scdtype = '2' )
begin
select @already_exists = count(1)
from sys.columns
inner join sys.extended_properties
on extended_properties.major_id = columns.object_id
and extended_properties.minor_id = columns.column_id
and extended_properties.name = 'ScdType'
where object_id = (select sysobjects.id from sys.sysobjects where sysobjects.name = @tablename)
and columns.name = @fieldname
if ( @already_exists = 0 )
begin
exec sys.sp_addextendedproperty
@name = N'Scd_Type',
@value = @scdtype,
@level0type = N'SCHEMA',
@level0name = @dbschema,
@level1type = N'TABLE',
@level1name = @tablename,
@level2type = N'COLUMN',
@level2name = @fieldname
end
else
begin
exec sys.sp_updateextendedproperty
@name = N'Scd_Type',
@value = @scdtype,
@level0type = N'SCHEMA',
@level0name = @dbschema,
@level1type = N'TABLE',
@level1name = @tablename,
@level2type = N'COLUMN',
@level2name = @fieldname
end
end
end
再次感谢绝对正确。您应该使用ANSI标准的信息模式视图,可以在其他数据库平台SQL Server、Oracle、MySql等中找到。非常有用。我同意您的看法。但是关于我的列在我的ETL中作为type1或type2数据处理的信息不能存储在那里。或者可以吗?在信息的顶部创建一个视图,然后利用该视图。哦,对不起!类型1和类型2指的是您在数据仓库中保存的历史类型。Type1意味着你只需要覆盖现有的数据,而type2意味着你必须终止当前记录,因此开始和结束日期必须确定,并用其中的新数据创建一个新记录。哦,我刚刚想出了一个方法来实现我想要的。我可以在列描述中存储一些自由文本,然后将其返回sys.extended_properties表。我可以在该描述中存储类似TYPE_1_数据或TYPE_2_数据标志的内容。这并不完美,但比单独一张桌子要好得多。