Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server 2008 R2中某列的元数据?_Tsql_Sql Server 2008_Ssis - Fatal编程技术网

Tsql SQL Server 2008 R2中某列的元数据?

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]。 ==>在这里,我们为这个特定维度插入自定义代码,它将首先从数据源查询数据并获取我的增量,然后转换数据,最后

我正试图找到一种方法来存储有关列的元数据,而不必重复我自己

我目前正在处理一个通用维度加载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信息


更新:我还考虑过创建用户定义的类型,比如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_数据标志的内容。这并不完美,但比单独一张桌子要好得多。