none
Duvida em sequenciar campo - Sql Server RRS feed

  • Pergunta

  • Bom Dia a Todos

    estou criando um banco de dados em sql server 2008
    e pintou ai um duvida ao sequenciar um campo ex: campo cod_id
    eu não posso usar ele como um IDENTITY
    porem preciso sequencia-lo de forma que posso ordena a ordem de qual numeração ele irá começa

    isso é possível de ser executado?

    der de já agradeço pela atenção de todos

    terça-feira, 8 de março de 2016 10:55

Respostas

  • Rhael,

    você pode alterar a sequência de um campo identity e também pode desabilitá-lo para fazer inserções avulsas e depois habilitá-lo novamente.

    SET IDENTITY_INSERT

     Permite explicitar valores a serem inseridos em coluna indentity de uma tabela.

    DBCC CHECKIDENT (Transact-SQL)

    Verifica o valor de identidade atual da tabela especificada no SQL Server e, se necessário, altera o valor da identidade. Você também pode usar DBCC CHECKIDENT para definir manualmente um novo valor de identidade atual para a coluna de identidade.


    Antero Marques



    terça-feira, 8 de março de 2016 14:49
  • Rhael,

    Veja se este exemplo te ajuda:

    Declare @Identity Int
    
    ---Refazendo numeração Controle de Entrada - Matéria Prima ---
    Set @Identity=(Select Ident_Current('CTEntrada'))
    
    DBCC CheckIdent('CTEntrada_PQC',Reseed,@Identity)
    Go

    Ou este outro:

    --Resentando o valor Identity
    DBCC CHECKIDENT ('CTEntrada', RESEED, 245)
    
    --Exibindo o valor Identity
    DBCC CHECKIDENT ('CTEntrada', NORESEED)


    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 Rhael_Andrade terça-feira, 8 de março de 2016 16:20
    terça-feira, 8 de março de 2016 15:52

Todas as Respostas

  • Bom dia Rhael,

    Não sei se entendi bem sua necessidade,

    Porém você pode colocar o campo codcid como chave primaria, assim consequentemente ele ficara sempre ordenado.

    Att

    Reginaldo Silva

    terça-feira, 8 de março de 2016 11:56
  • sim mais seu eu usar ele como código primário e precisar alterar o código futuramente não consigo.
    terça-feira, 8 de março de 2016 13:28
  • Me dá o layout do banco de dados?
    Me fala porque tal campo ou tais campos quer fazer isso?

    Me diga o proposito de alterar a chave que identifica a linha?

    Quais motivos leva a fazer tal coisa?


    Fulvio C

    terça-feira, 8 de março de 2016 13:34
  • Vamos supor que tenho um banco de dados chamado BD_Sql

    no banco sql tenho uma tabela com o campo primário conforme vc falou certo
    so que amanha apareceu um banco de dados que preciso migra os dados dele para o BD_Sql certo

    se o campo for primário eu não consigo fazer com que os código dos cliente seja o msm do banco que foi migrado 
    por isso tenho que ter um sequenciador para que eu possa alterar a sequencia manualmente 

    terça-feira, 8 de março de 2016 14:07
  • Rhael,

    você pode alterar a sequência de um campo identity e também pode desabilitá-lo para fazer inserções avulsas e depois habilitá-lo novamente.

    SET IDENTITY_INSERT

     Permite explicitar valores a serem inseridos em coluna indentity de uma tabela.

    DBCC CHECKIDENT (Transact-SQL)

    Verifica o valor de identidade atual da tabela especificada no SQL Server e, se necessário, altera o valor da identidade. Você também pode usar DBCC CHECKIDENT para definir manualmente um novo valor de identidade atual para a coluna de identidade.


    Antero Marques



    terça-feira, 8 de março de 2016 14:49
  • Vamos supor que tenho um banco de dados chamado BD_Sql

    no banco sql tenho uma tabela com o campo primário conforme vc falou certo
    so que amanha apareceu um banco de dados que preciso migra os dados dele para o BD_Sql certo

    se o campo for primário eu não consigo fazer com que os código dos cliente seja o msm do banco que foi migrado 
    por isso tenho que ter um sequenciador para que eu possa alterar a sequencia manualmente 

    Foi explicado melhor agora!

    E a resposta do nosso amigo Antero Marques resume o que precisa!


    Fulvio C

    terça-feira, 8 de março de 2016 15:16
  • Rhael,

    Veja se este exemplo te ajuda:

    Declare @Identity Int
    
    ---Refazendo numeração Controle de Entrada - Matéria Prima ---
    Set @Identity=(Select Ident_Current('CTEntrada'))
    
    DBCC CheckIdent('CTEntrada_PQC',Reseed,@Identity)
    Go

    Ou este outro:

    --Resentando o valor Identity
    DBCC CHECKIDENT ('CTEntrada', RESEED, 245)
    
    --Exibindo o valor Identity
    DBCC CHECKIDENT ('CTEntrada', NORESEED)


    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 Rhael_Andrade terça-feira, 8 de março de 2016 16:20
    terça-feira, 8 de março de 2016 15:52
  • Sugestão,

    Crie a seguinte tabela TABSEQ, nela vc. irá criar sua sequencia utilizando a coluna "CHAVE", inclusive vc. poderá altera-la via programa caso precise.

    CREATE TABLE dbo.TABSEQ (
      ID int IDENTITY(1, 1) NOT NULL,
      CHAVE int NULL,
      PRIMARY KEY CLUSTERED (ID)
        WITH (
          PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF,
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    )
    ON [PRIMARY]
    GO

    Agora criei uma tabela de exemplo p/ vc. a TABTESTE, note que a primary key dela não é "identity"

    CREATE TABLE dbo.TABTESTE (
      ID int NOT NULL,
      DETALHE char(30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
      PRIMARY KEY CLUSTERED (ID)
        WITH (
          PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF,
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    )
    ON [PRIMARY]
    GO

    Agora crie uma storeprocedure, a ideia aqui é ao incluir seu registro, acessar a tabela TABSEQ, pegar o valor de CHAVE, incrementa-lo com 1 e inserir como ID na tabela TABTESTE.

    Só um detalhe, no final do insert precisa fazer um update na tabela TABSEQ atualizando a coluna CHAVE.

    SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE dbo.InsereTabTest @DETALHE CHAR(30) AS BEGIN INSERT INTO TABTESTE (ID, DETALHE) SELECT (CHAVE + 1), @DETALHE FROM TABSEQ WHERE ID = 1

    update TABSEQ  SET CHAVE = A.ID
    FROM (
    SELECT MAX(ID) ID FROM TABTESTE 
        ) A
    WHERE 
    TABSEQ.ID = 1

    END

    Acho q é isso que vc. pediu... boa sorte


    terça-feira, 8 de março de 2016 16:51