2011-10-06 36 views
2

我试图找出一种方法来存储有关列的元数据,而无需重复自己。关于SQL Server 2008 R2中列的元数据?

我目前正在处理一个通用的维度加载SSIS包,将处理我所有的维度。目前,它的作用:

  1. 创建临时表相同的参数定的表名(这是接收表名作为参数,一个通用的存储过程,然后执行:select top 0 * into ##[INSERT ORIGINAL TABLE NAME HERE] from [INSERT ORIGINAL TABLE NAME HERE])。
  2. ==>在这里,我们为这个特定维度插入自定义代码,它将首先查询数据源中的数据并获取我的增量,然后转换数据并最终将其加载到我的临时表中。
  3. 用T-SQL MERGE将临时表合并到我的原始表中,相应地处理type1和type2字段。

我现在的问题是,我必须维护一个表中的所有字段来存储元数据告诉我的脚本,如果这个特定的字段是type1或type2 ...这是无稽之谈,我可以得到来自sys.columns/sys.types的相同数据(减去type1/type2)。

我最终想着将字段重命名为包含它们的类型,例如: FirstName_T2,LastName_T2,Sex_T1(好吧,我知道这可以是type2,让我们不要陷入这里的辩论)。

你会怎样做呢?我的解决方案(使用具有该元数据的表格)目前就位并且正在工作,但很明显,从systables重复自定义表格是无稽之谈,仅适用于简单的type1/type2信息。

更新:我也想过创建用户定义类型,如VARCHAR => t1_varchar,t2_varchar等,这听起来似乎有点sluggy太...

回答

2

我知道这是不好的,但我会发布一个答案我自己的问题......感谢GBN的帮助寿!

我现在将“标志”存储在我的列的“说明”字段中。例如,我可以用这种方式存储一个标志:“TYPE_2_DATA”。

然后,我用这个查询得到旗回每列:

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 

现在我可以存储大约列的元数据,而无需创建一个单独的表。我使用已经存在的东西,我不重复自己。我不确定这是否是最好的解决方案,但它的工作原理比复制信息要好得多。未来,我将能够使用此字段存储更多元数据,其中:“TYPE_2_DATA | ANOTHER_FLAG | ETC | OH BOY!”。

更新:

我现在将信息存储在单独的扩展属性中。您可以使用sp_addextendedpropertysp_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 

再次感谢

4

你需要的一切应该已经在INFORMATION_SCHEMA.COLUMNS

我不能按照你的想法不是使用提供的表格/视图...

编辑:正如scarpacci提到的,​​如果需要,这可以稍微便携。

+0

是绝对正确的。您应该使用ANSI标准的information_schema视图,并且可以在其他数据库平台(SQL Server,Oracle,MySql等)中找到它们。很有用。 – scarpacci

+0

我同意你的意见。但是我的列在我的ETL中作为类型1或类型2数据处理的信息不能存储在那里。或者它可以吗? –

+0

使用该信息在信息之上创建视图,然后利用该视图。 – scarpacci