none
Merge para primary RRS feed

  • Pergunta

  • Bom dia,

    Estou com um problema para trabalhar com merge. Além da demora em efetuar o processo, eu não consigo fazer o merge para um limitador setado na PRIMARY.


    Preciso automatizar uma rotina para trabalhar com filegroup utilizando o switch, merge, next used e split.

    Pois bem, tenho um total de 50 limitadores sendo que para cada, minha referencia é de mês e tenho que armazenar durante 4 anos todos os ree a minha PRIMARY fica setada para o quinto ano.

    Dessa forma, quando faço o merge todos os 49 não ficam mais ativos, só que eu não consigo fazer o merge para a PRIMARY.

    Nisso, quando faço o next used com o split, meu resultado acaba ficando errado, pois a cada final de ano, essa rotina tem que andar um ano para frete.

    Quando termino de rodar o next used com o split, a minha PRIMARY fica setada para dezembro e não para o próximo ano como estava inicialmente.

    No mais, agradeço muito a todos pela compreensão.
    Estou passando meu código abaixo:

    Criação dos Filegroups:

    /*filegroups creation*/
    ALTER DATABASE DB_SSMCB ADD FILEGROUP January
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP February
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP March
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP April
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP May
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP June
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP July
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP August
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP September
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP October
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP November
    GO
    ALTER DATABASE DB_SSMCB ADD FILEGROUP December
    GO

    ALTER DATABASE DB_SSMCB ADD FILEGROUP [fg_old_year_1]
    GO

    ALTER DATABASE DB_SSMCB ADD FILEGROUP [fg_old_year_2]
    GO

    ALTER DATABASE DB_SSMCB ADD FILEGROUP [fg_old_year_3]
    GO

    /*files creation*/
    --file old_year_1
    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'old_year_1',
        FILENAME = N'C:\BaseDados\old_year_1.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP [fg_old_year_1]
    GO

    --file old_year_2
    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'old_year_2',
        FILENAME = N'C:\BaseDados\old_year_2.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP [fg_old_year_2]
    GO

    --file old_year_3
    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'old_year_3',
        FILENAME = N'C:\BaseDados\old_year_3.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP fg_old_year_3
    GO

    --adding 12 months
    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'january',
        FILENAME = N'C:\BaseDados\january.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP january
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'february',
        FILENAME = N'C:\BaseDados\february.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP february
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'march',
        FILENAME = N'C:\BaseDados\march.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP march
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'april',
        FILENAME = N'C:\BaseDados\april.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP april
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'may',
        FILENAME = N'C:\BaseDados\may.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP may
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'june',
        FILENAME = N'C:\BaseDados\june.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP june
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'july',
        FILENAME = N'C:\BaseDados\july.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP july
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'august',
        FILENAME = N'C:\BaseDados\august.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP august
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'september',
        FILENAME = N'C:\BaseDados\september.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP september
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'october',
        FILENAME = N'C:\BaseDados\october.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP october
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'november',
        FILENAME = N'C:\BaseDados\november.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP november
    GO

    ALTER DATABASE DB_SSMCB
    ADD FILE
    (
        NAME = N'december',
        FILENAME = N'C:\BaseDados\december.ndf',
        SIZE = 150MB,
        FILEGROWTH = 20%
    )
    TO FILEGROUP december
    GO

    /*Criação da partition Function e Scheme*/

    CREATE PARTITION FUNCTION pf_fact_tables (INT)
    AS RANGE RIGHT
    FOR VALUES
    (
        cast(cast(convert(varchar(8),year(GETDATE()),112)-5 as varchar)+'0101' as int), --oldest

        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0131' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0229' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0331' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0430' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0531' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0630' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0731' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0831' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'0930' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'1031' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'1130' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-4 as varchar)+'1231' as int),
        
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0131' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0228' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0331' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0430' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0531' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0630' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0731' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0831' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'0930' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'1031' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'1130' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-3 as varchar)+'1231' as int),
        
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0131' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0228' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0331' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0430' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0531' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0630' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0731' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0831' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'0930' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'1031' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'1130' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-2 as varchar)+'1231' as int),
        
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0131' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0228' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0331' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0430' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0531' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0630' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0731' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0831' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'0930' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'1031' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'1130' as int),
        cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'1231' as int)

    );

    --49 partitions

    CREATE PARTITION SCHEME ps_fact_tables
    AS PARTITION pf_fact_tables
    TO
    (
        [fg_old_year_1], --oldest

        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],
        [fg_old_year_1],

        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],
        [fg_old_year_2],

        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],
        [fg_old_year_3],

        January,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December,
        
        [PRIMARY]
    );
    --50 scheme

    /*Criação das tabelas*/

    /*Irá pegar de 20110101 até 20151231*/
    IF OBJECT_ID('new.tabelaOperacao','U') IS NOT NULL
        DROP TABLE new.tabelaOperacao;
    CREATE TABLE new.tabelaOperacao(
          id INT NOT NULL IDENTITY(1,1)
        , nome CHAR(100) DEFAULT NEWID()
        , endereco CHAR(100) DEFAULT NEWID()
        , dataCadastro INT NOT NULL
        ,CONSTRAINT CK_tabelaOperacao_DateRange CHECK
            (dataCadastro >= (cast(cast(convert(varchar(8),year(GETDATE()),112)-5 as varchar)+'0101' as int))
         AND dataCadastro < (cast(cast(convert(varchar(8),year(GETDATE()),112)-1 as varchar)+'1231' as int)))
        , CONSTRAINT pk_tb_Oper PRIMARY KEY CLUSTERED (id asc, dataCadastro asc)
    )
    ON ps_fact_tables(dataCadastro)
    GO

    IF OBJECT_ID('archive.tabelaOperacao','U') IS NOT NULL
        DROP TABLE archive.tabelaOperacao;
    CREATE TABLE archive.tabelaOperacao(
          id INT NOT NULL IDENTITY(1,1)
        , nome CHAR(100) DEFAULT NEWID()
        , endereco CHAR(100) DEFAULT NEWID()
        , dataCadastro INT NOT NULL
        , CONSTRAINT pk_tb_tOper PRIMARY KEY CLUSTERED (id asc, dataCadastro asc)
        )
    ON ps_fact_tables(dataCadastro)
    GO

    /*Check das informações*/


    create view vw_check_inf_partition
    as
    SELECT N'DatabaseName' = DB_NAME(), N'SchemaName' = s.name
        , N'TableName' = o.name
        , N'IndexName' = i.name
        , N'IndexType' = i.type_desc
        , N'PartitionScheme' = ps.name
        , N'DataSpaceName' = ds.name
        , N'DataSpaceType' = ds.type_desc
        , N'PartitionFunction' = pf.name
        , N'PartitionNumber' = dds.destination_id
        , N'BoundaryValue' = prv.value
        , N'RightBoundary' = pf.boundary_value_on_right
        , N'PartitionFileGroup' = ds2.name
        , N'RowsOfData' = p.[rows]
    FROM
        sys.objects AS o
        INNER JOIN sys.schemas AS s ON o.[schema_id] = s.[schema_id]
        INNER JOIN sys.partitions AS p ON o.[object_id] = p.[object_id]
        INNER JOIN sys.indexes AS i ON p.[object_id] = i.[object_id] AND p.index_id = i.index_id
        INNER JOIN sys.data_spaces AS ds ON i.data_space_id = ds.data_space_id
        LEFT OUTER JOIN sys.partition_schemes AS ps ON ds.data_space_id = ps.data_space_id
        LEFT OUTER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
        LEFT OUTER JOIN sys.partition_range_values AS prv ON pf.function_id = prv.function_id AND p.partition_number = prv.boundary_id
        LEFT OUTER JOIN sys.destination_data_spaces AS dds ON ps.data_space_id = dds.partition_scheme_id AND p.partition_number = dds.destination_id
        LEFT OUTER JOIN sys.data_spaces AS ds2 ON dds.data_space_id = ds2.data_space_id
    WHERE s.name IN ('archive','new') -- schema name

    /*Switch*/

    /*Cria um loop para enviar os dados entre a new.tabelaoperacao e a archive.tabelaoperacao*/
    declare  @total int ,@cont int

    select @total = max(PartitionNumber) from vw_check_inf_partition where schemaname = 'new'
        set @cont = 0
    while (@cont < @total)
    begin
        set @cont = @cont+1
        alter table new.tabelaoperacao switch partition @cont to archive.tabelaoperacao partition @cont;
    end

    /*Merge*/

    /*Criação da tabela temporária para que possamos automatizar as datas já pre-fixadas*/
    use DB_SSMCB
    GO
    select
        [PartitionNumber],
        cast(convert(varchar(8),DATEADD(year,1,cast(cast([BoundaryValue] as varchar(8)) as date)),112) as int) [BoundaryValue],
        [PartitionFileGroup]
    into tmp_table
    from vw_check_inf_partition
    where schemaname = 'new' and [PartitionNumber] between 1 and 49
    order by [PartitionNumber]
    go

    /*Cursor para execução do merge. Dessa forma vamos apagar "todos" os limites de cada range com excessão da primary*/
    DECLARE @BoundaryValue int
    DECLARE curObj CURSOR FOR
        
        select cast(BoundaryValue as int) from vw_check_inf_partition where schemaname = 'new' and isnull(BoundaryValue,'') <> ''
        order by databasename, schemaname, tablename, indexname, partitionnumber

    OPEN curObj
    FETCH NEXT FROM curObj INTO @BoundaryValue

    WHILE @@FETCH_STATUS = 0
    BEGIN
          alter partition function pf_fact_tables() merge range(@BoundaryValue);

        FETCH NEXT FROM curObj INTO @BoundaryValue
    END

    CLOSE curObj
    DEALLOCATE curObj

    /*Sliding Windows*/


    /*Criação automatica dos limites de cada range*/
    DECLARE @PartitionNumber    int,
            @BoundaryValue        int,
            @PartitionFileGroup varchar(13),
            @sql_txt            varchar(256) = 'ALTER PARTITION SCHEME ps_fact_tables NEXT USED',
            @sql                varchar(256)

    DECLARE curNxtSplit CURSOR FOR
        
        select [BoundaryValue],[PartitionFileGroup] from tmp_table

    OPEN curNxtSplit
    FETCH NEXT FROM curNxtSplit INTO @BoundaryValue, @PartitionFileGroup

    WHILE @@FETCH_STATUS = 0
    BEGIN

          set @sql = @sql_txt + ' ' + @PartitionFileGroup
          execute(@sql)
          ALTER PARTITION FUNCTION pf_fact_tables() SPLIT RANGE (@BoundaryValue)

        FETCH NEXT FROM curNxtSplit INTO @BoundaryValue, @PartitionFileGroup
    END

    CLOSE curNxtSplit
    DEALLOCATE curNxtSplit


    quinta-feira, 14 de janeiro de 2016 04:57

Respostas

  • Daniel,

    Veja o que diz o Books On-Line do SQL Server:

    "Merge Range: Drops a partition and merges any values that exist in the partition into one of the remaining partitions. RANGE ( boundary_value) must be an existing boundary value, into which the values from the dropped partition are merged. The filegroup that originally held boundary_value is removed from the partition scheme unless it is used by a remaining partition, or is marked with the NEXT USED property. The merged partition resides in the filegroup that originally did not hold boundary_value. boundary_value is a constant expression that can reference variables (including user-defined type variables) or functions (including user-defined functions). It cannot reference a Transact-SQL expression. boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column, and cannot be truncated during implicit conversion in a way that the size and scale of the value does not match that of its corresponding input_parameter_type. "

    O que esta aparecendo é o valor informado no @boundary_value esta totalmente fora dos limites que você esta manipulando.

    Você realmente precisa fazer o Merge Range? Será que neste caso o Split Range não seria uma alternativa?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ segunda-feira, 18 de janeiro de 2016 14:17
    quinta-feira, 14 de janeiro de 2016 16:29
  • Pedro,

    Me desculpe a demorar para responder. Deu certo.
    Eu não precisava fazer o merge e nem o split. Bastava apenas apagar o indice atual, recriar um indice apontando para primary, recriar a function com o novo range e o schema e por fim, recriar o indice novamente apontando para a function com o novo range.

    Muito obrigado por ter me ajudado e pela paciência.

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 19 de janeiro de 2016 14:33
    • Marcado como Resposta Marcos SJ terça-feira, 19 de janeiro de 2016 15:29
    terça-feira, 19 de janeiro de 2016 14:20

Todas as Respostas

  • Daniel_Santos,

    Você planeja de que forma realizar este merge?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 14 de janeiro de 2016 11:28
  • Pedro, eu queria fazer da forma norma primeiro Ex.: Alter partition function pfunc() merge range (null) ou (primary). Sei que preciso de um range, mas no projeto A primary está sendo em branco no momento de criar a func scheme. Obrigado.
    quinta-feira, 14 de janeiro de 2016 11:51
  • Daniel,

    Então, mas será que o SQL Server esta conseguindo interpretar e reconhecer justamente estas valores que estão sendo passadas para primary?

    Parece que a conversão que você esta fazendo na partition function esta impactando no reconhecimento e distribuição do dado para o partition schema.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 14 de janeiro de 2016 11:55
  • Eu não sei te dizer com certeza, pois ele funciona Em todos os outros ranges. Quando rodo somente para esse ele reclama dizendo que é preciso Ter um valor informado.
    quinta-feira, 14 de janeiro de 2016 12:05
  • O problema que isso tem impacto direto no meu resultado final, pois o meu mês de dezembro deveria ficar relacionado a dezembro do ano corrente. Pelo motivo de não conseguir dar o merge, dezembro fica null.
    quinta-feira, 14 de janeiro de 2016 12:08
  • Daniel,

    Então, mas a distribuição dos dados para os schemas é de acordo com a posição do dado dentro da faixa.

    Somente o mês de dezembro esta ficando Null?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 14 de janeiro de 2016 12:36
  • Pedro, É isso mesmo. Quando crio toda a estrutura pela primeira vez, tudo fica organizado, porém depois do merge, o que deveria ser de fevereiro passajaríeis até chegar a dezembro que fica com null. O que não estou conseguindo é deixar a mesma organização antes de rodar o merge.
    quinta-feira, 14 de janeiro de 2016 12:46
  • Daniel,

    Certo, bom então aparentemente o problema esta ocorrendo no merge!!!

    De que forma você esta realizando isso?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 14 de janeiro de 2016 12:52
  • Pedro, Criei um cursor para buscar todas as boundaryVslues que tem na minha partição. Isso da um total de 50 partições . Como o merge não aceita null, meu cursor só roda as 49. O valor que recebo na boundaryValue foi convertido para int. Eu preferi fazer um cursor para não ter que criar 50 linhas para cada range.

    • Editado Daniel_Santos quinta-feira, 14 de janeiro de 2016 13:14
    quinta-feira, 14 de janeiro de 2016 13:10
  • Daniel,

    Certo, estou começando a entender, então neste caso como o merge não aceita valor nulo. Não seria o caso de tentar fazer uma verificação se o valor é nulo antes de ocorrer o Merge?

    Talvez tentar de alguma maneira fazer uma análise e utilizar as funções IsNull, Coalesce ou NullIF.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 14 de janeiro de 2016 13:32
  • Pedro,

    Já fiz isso.

    O merge não consegue entender que o null ou vazio é uma referência a minha partição vinculada a primary. Antes do merge meu resultado fica assim:

    numpart boundaryValue     filegroup
    50           Null                      Primary

    Depois do merge

    numpart  boundaryValue   filegroup
    1              Null                    Fg_old_year_1

    • Editado Daniel_Santos quinta-feira, 14 de janeiro de 2016 15:56
    quinta-feira, 14 de janeiro de 2016 15:05
  • Daniel,

    Veja o que diz o Books On-Line do SQL Server:

    "Merge Range: Drops a partition and merges any values that exist in the partition into one of the remaining partitions. RANGE ( boundary_value) must be an existing boundary value, into which the values from the dropped partition are merged. The filegroup that originally held boundary_value is removed from the partition scheme unless it is used by a remaining partition, or is marked with the NEXT USED property. The merged partition resides in the filegroup that originally did not hold boundary_value. boundary_value is a constant expression that can reference variables (including user-defined type variables) or functions (including user-defined functions). It cannot reference a Transact-SQL expression. boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column, and cannot be truncated during implicit conversion in a way that the size and scale of the value does not match that of its corresponding input_parameter_type. "

    O que esta aparecendo é o valor informado no @boundary_value esta totalmente fora dos limites que você esta manipulando.

    Você realmente precisa fazer o Merge Range? Será que neste caso o Split Range não seria uma alternativa?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ segunda-feira, 18 de janeiro de 2016 14:17
    quinta-feira, 14 de janeiro de 2016 16:29
  • Pedro,

    Não havia pensado nessa possíbilidade.

    Vou fazer o teste e posto o resultado aqui.

    Obrigado.

    quinta-feira, 14 de janeiro de 2016 16:37
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 18 de janeiro de 2016 14:17
  • Pedro,

    Me desculpe a demorar para responder. Deu certo.
    Eu não precisava fazer o merge e nem o split. Bastava apenas apagar o indice atual, recriar um indice apontando para primary, recriar a function com o novo range e o schema e por fim, recriar o indice novamente apontando para a function com o novo range.

    Muito obrigado por ter me ajudado e pela paciência.

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 19 de janeiro de 2016 14:33
    • Marcado como Resposta Marcos SJ terça-feira, 19 de janeiro de 2016 15:29
    terça-feira, 19 de janeiro de 2016 14:20