none
Existe algo semelhante ao UNSIGNED (MySQL) no SQL Server? RRS feed

  • Pergunta

  • Todos os tipos inteiros no MySQL podem ter o atributo opcional UNSIGNED. Esse atributo é usado para permitir somente valores não negativos em uma coluna, gerando uma faixa numérica maior de números positivos nessa coluna. Por exemplo, uma coluna do tipo INT:

    Faixa: de -2147483648 a 2147483647

    Faixa UNSIGNED: de a 4294967295

    Existe algo no SQL Server que faça a mesma coisa?

    Obrigado pela atenção de todos.


    quarta-feira, 15 de fevereiro de 2012 10:37

Respostas

  • Michel

    no SQL não temos este datatype, mas você pode contornar este problema de duas maneiras

    1- criando uma check constraint em sua tabela para aceitar somente valores >0

    --cria tabela de teste
    Create table tbTeste (coluna1 int)
    go
    -- cria check constraint
    alter table tbTeste add constraint chkUnsigned check(coluna1 >=0)
    go
    
    --insere valor correto
    insert into tbTeste values (1)
    --insere valor errado
    insert into tbTeste values (-10)

    ao incluir i valor <0 vc deverá receber uma mensagem de erro da constraint

    Msg 547, Level 16, State 0, Line 2
    The INSERT statement conflicted with the CHECK constraint "chkUnsigned". The conflict occurred in database "dbTeste", table "dbo.tbTeste", column 'coluna1'.

    2- Criando o datatupe insigned e atribui uma rule >0 para ele.

    drop table tbTeste
    go
    --cria datatype
    CREATE TYPE dbo.unsigned FROM int NULL
    GO
    -- cria rule >=0
    CREATE RULE dbo.unsignedRule AS @value >= 0;
    GO
    EXEC sp_bindrule 'dbo.unsignedRule', 'dbo.unsigned'
    go
    -- cria tabela com datype unsigned
    Create table tbTeste (coluna1 unsigned) 
    -- valor correto
    insert into tbTeste values (1)
    valor errado
    insert into tbTeste values (-10)
    go
    drop table tbTeste

    o erro para valores <0 será:

    A column insert or update conflicts with a rule imposed by a previous CREATE RULE statement. The statement was terminated. The conflict occurred in database 'master', table 'dbo.tbTeste', column 'coluna1'.
    The statement has been terminated.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 15 de fevereiro de 2012 11:00
    Moderador
  • Michael,

    A orientação do Marcelo foi perfeito, eu particularmente prefiro utilizar uma constraint ao invês de criar um novo tipo de dados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Michaelfdias quarta-feira, 15 de fevereiro de 2012 12:35
    quarta-feira, 15 de fevereiro de 2012 11:03

Todas as Respostas

  • Michel

    no SQL não temos este datatype, mas você pode contornar este problema de duas maneiras

    1- criando uma check constraint em sua tabela para aceitar somente valores >0

    --cria tabela de teste
    Create table tbTeste (coluna1 int)
    go
    -- cria check constraint
    alter table tbTeste add constraint chkUnsigned check(coluna1 >=0)
    go
    
    --insere valor correto
    insert into tbTeste values (1)
    --insere valor errado
    insert into tbTeste values (-10)

    ao incluir i valor <0 vc deverá receber uma mensagem de erro da constraint

    Msg 547, Level 16, State 0, Line 2
    The INSERT statement conflicted with the CHECK constraint "chkUnsigned". The conflict occurred in database "dbTeste", table "dbo.tbTeste", column 'coluna1'.

    2- Criando o datatupe insigned e atribui uma rule >0 para ele.

    drop table tbTeste
    go
    --cria datatype
    CREATE TYPE dbo.unsigned FROM int NULL
    GO
    -- cria rule >=0
    CREATE RULE dbo.unsignedRule AS @value >= 0;
    GO
    EXEC sp_bindrule 'dbo.unsignedRule', 'dbo.unsigned'
    go
    -- cria tabela com datype unsigned
    Create table tbTeste (coluna1 unsigned) 
    -- valor correto
    insert into tbTeste values (1)
    valor errado
    insert into tbTeste values (-10)
    go
    drop table tbTeste

    o erro para valores <0 será:

    A column insert or update conflicts with a rule imposed by a previous CREATE RULE statement. The statement was terminated. The conflict occurred in database 'master', table 'dbo.tbTeste', column 'coluna1'.
    The statement has been terminated.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 15 de fevereiro de 2012 11:00
    Moderador
  • Michael,

    A orientação do Marcelo foi perfeito, eu particularmente prefiro utilizar uma constraint ao invês de criar um novo tipo de dados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Michaelfdias quarta-feira, 15 de fevereiro de 2012 12:35
    quarta-feira, 15 de fevereiro de 2012 11:03
  • Então..

    Posso ter interpretado errado as respostas, mas o UNSIGNED não é um datatype, é uma propriedade que pode ser agregada aos tipos de dados int. A vantagem dessa propriedade não é a de não aceitar valores negativos, e sim "dobrar" a quantidade de números positivos aceitos pelo tipo int definido, sem aumentar o tamanho original de armazenamento desse tipo int.

    quarta-feira, 15 de fevereiro de 2012 12:42