Метаданные о столбце в SQL Server 2008 R2? - PullRequest
2 голосов
/ 06 октября 2011

Я пытаюсь найти способ хранения метаданных о столбце без повторения.

В настоящее время я работаю над универсальным пакетом загрузки служб SSIS, который будет обрабатывать все мои измерения. В настоящее время это делает:

  1. Создайте временную таблицу, идентичную заданному имени таблицы в параметрах (это общая хранимая процедура, которая получает имя таблицы в качестве параметра, а затем делает: select top 0 * into ##[INSERT ORIGINAL TABLE NAME HERE] from [INSERT ORIGINAL TABLE NAME HERE]).
  2. ==> Здесь мы вставляем пользовательский код для этого конкретного измерения, который сначала запросит данные из источника данных и получит мою дельту, затем преобразует данные и, наконец, загружает их во временную таблицу.
  3. Объединить временную таблицу в мою исходную таблицу с помощью T-SQL MERGE, заботясь о полях type1 и type2 соответственно.

Моя проблема сейчас заключается в том, что мне нужно вести таблицу со всеми полями в ней, чтобы хранить метаданные, чтобы сообщить моим сценариям, является ли это конкретное поле типом 1 или типом 2 ... это нонсенс, я могу получить те же данные (минус type1 / type2) из ​​sys.columns / sys.types.

В конечном итоге я думал о переименовании моих полей, чтобы включить в них их тип, например: FirstName_T2, LastName_T2, Sex_T1 (ну, я знаю, это может быть type2, давайте не будем вдаваться в эту дискуссию).

Что бы вы, ребята, сделали с этим? Мое решение (использующее таблицу с этими метаданными) в настоящее время работает и работает, но очевидно, что повторять себя из systables в пользовательскую таблицу - нонсенс, просто для простой информации type1 / type2.

ОБНОВЛЕНИЕ: Я также думал о создании пользовательских типов, таких как varchar => t1_varchar, t2_varchar и т. Д. Это тоже звучит как нечто вялое ...

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Все, что вам нужно, уже должно быть в INFORMATION_SCHEMA.COLUMNS

Я не могу следовать вашим представлениям о , а не , используя предоставленные таблицы / представления ...

Редактировать: Как упомянуто скарпачи, это несколько переносимо, если необходимо.

2 голосов
/ 06 октября 2011

Я знаю, что это плохо, но я опубликую ответ на свой вопрос ... Спасибо 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_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

Еще раз спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...