2011-10-06 38 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