SQL Server Tipos de dados no SQL Server Tipos de dados básicos que o SQL Server fornece para o armazenamento de informações. Uma boa análise do tipo de dado para cada campo (também referenciado como coluna da tabela) pode ser extremamente vantajosa, tanto a nível de performance, escalabilidade, modelagem e tamanho do banco de dados. Antes de começar, vou mostrar como podemos criar uma tabela através da sintaxe básica da instrução SQL CREATE TABLE: CREATE TABLE table_name ( nome_campo tipo_dado [[NOT] NULL] , nome_campo1 tipo_dado [[NOT] NULL] , nome_campo2 tipo_dado [[NOT] NULL] , nome_campo3 tipo_dado [[NOT] NULL] , ... ) A instrução CREATE TABLE possui mais opções, porém a sintaxe básica que eu apresentei aqui está no padrão ANSI e pode ser utilizada para criar tabelas em outros bancos de dados como o Oracle, MySQL, DB, etc. Um exemplo de criação de uma tabela com dois campos: CREATE TABLE Exemplo1 ( codigo INT NOT NULL , nome CHAR(30) NULL ) A tabela chamada Exemplo1 foi criada com dois campos: codigo, do tipo INT e nome do tipo CHAR(30). Junto com o tipo de dados, devemos especificar se este campo permite ou não seu preenchimento com NULO (nulabilidade), que quer dizer ausência de dados. Se não especificarmos nada para o campo, por padrão o campo irá aceitar valores NULL. Abaixo segue uma relação dos tipos de dados básicos do SQL Server, sendo que os tipos que estiverem marcados com * somente funcionam a partir do SQL Server 2000 TINYINT: Valores numéricos inteiros variando de 0 até 256 SMALLINT: Valores numéricos inteiros variando de –32.768 até 32.767 INT: Valores numéricos inteiros variando de -2.147.483.648 até 2.147.483.647 * BIGINT: Valores numéricos inteiros variando de –92.23.372.036.854.775.808 até 9.223.372.036.854.775.807 BIT: Somente pode assumir os valores 0 ou 1. Utilizado para armazenar valores lógicos. DECIMAL(I,D) e NUMERIC(I,D): Armazenam valores numéricos inteiros com casas decimais utilizando precisão. I deve ser substituído pela quantidade de dígitos total do número e D deve ser substituído pela quantidade de dígitos da parte decimal (após a vírgula). DECIMAL e NUMERIC possuem a mesma funcionalidade, porém DECIMAL faz parte do padrão ANSI e NUMERIC é mantido por compatibilidade. Por exemplo, DECIMAL(8,2) armazena valores numéricos decimais variando de – 999999,99 até 999999,99 Lembrando sempre que o SQL Server internamente armazena o separador decimal como ponto (.) e o separador de milhar como vírgula (,). Essas configurações INDEPENDEM de como o Windows está configurado no painel de controle e para DECIMAL E NUMERIC, somente o separador decimal (.) é armazenado SMALLMONEY: Valores numéricos decimais variando de -214.748,3648 até 214.748,3647 MONEY: Valores numéricos decimais variando de -922.337.203.685.477,5808 até 922.337.203.685.477,5807 REAL: Valores numéricos aproximados com precisão de ponto flutuante, indo de -3.40E + 38 até 3.40E + 38 FLOAT: Valores numéricos aproximados com precisão de ponto flutuante, indo de -1.79E + 308 até 1.79E + 308 SMALLDATETIME: Armazena hora e data variando de 1 de janeiro de 1900 até 6 de junho de 2079. A precisão de hora é armazenada até os segundos. DATETIME: Armazena hora e data variando de 1 de janeiro de 1753 até 31 de Dezembro de 9999. A precisão de hora é armazenada até os centésimos de segundos. CHAR(N): Armazena N caracteres fixos (até 8.000) no formato não Unicode. Se a quantidade de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do campo é preenchido com espaços em branco. VARCHAR(N): Armazena N caracteres (até 8.000) no formato não Unicode. Se a quantidade de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do campo não é preenchido. TEXT: Armazena caracteres (até 2.147.483.647) no formato não Unicode. Se a quantidade de caracteres armazenada no campo for menor que 2.147.483.647, o resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções específicas para trabalhar com este tipo de dado. NCHAR(N): Armazena N caracteres fixos (até 4.000) no formato Unicode. Se a quantidade de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do campo é preenchido com espaços em branco. NVARCHAR(N): Armazena N caracteres (até 4.000) no formato Unicode. Se a quantidade de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do campo não é preenchido. NTEXT: Armazena caracteres (até 1.073.741.823) no formato Unicode. Se a quantidade de caracteres armazenada no campo for menor que 1.073.741.823, o resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções específicas para trabalhar com este tipo de dado. BINARY(N): Armazena N (até 8.000 bytes) dados no formato binário. Se a quantidade de dados binários armazenados no campo for menor que o tamanho total especificado em N, o resto do campo é preenchido com espaços em branco. Procure não utilizar este tipo de dado diretamente, pois existem funções específicas para trabalhar com este tipo de dado. VARBINARY(N): Armazena N (até 8.000 bytes) dados no formato binário. Se a quantidade de dados binários armazenados no campo for menor que o tamanho total especificado em N, o resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções específicas para trabalhar com este tipo de dado. IMAGE: Armazena dados no formato binário (até 2,147,483,647 bytes). Se a quantidade de dados binários armazenados no campo for menor que o tamanho total especificado em N, o resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções específicas para trabalhar com este tipo de dado. CURSOR: Armazena uma referência (ponteiro) de um cursor do SQL Server. Não pode ser utilizado como um tipo de dado de uma tabela, somente em declarações de variáveis. * SQL_VARIANT: Permite o armazenamento de todos os tipos de dados em uma mesmo campo de uma tabela com exceção dos tipos TEXT, NTEXT, TIMESTAMP e SQL_VARIANT * TABLE: Armazena um conteúdo do resultado de uma instrução SELECT em uma variável de memória do SQL Server. Não pode ser utilizado como um tipo de dado de uma tabela, somente para declarações em variáveis. Este tipo de dados pode servir para suprir a necessidade de criação de arrays e matrizes no SQL Server. TIMESTAMP: Este tipo de dado permite a geração automática de uma valor binário para um campo de uma tabela do SQL Server. Cada tabela pode possuir somente um campo com o tipo de dadoTIMESTAMP. Para o tipo de dado TIMESTAMP, devemos ou criar um DEFAULT para seu valor padrão ou passar NULL para este campo em uma instrução INSERT, pois o banco de dados automaticamente gerará um valor binário para esta coluna. UNIQUEIDENTIFIER: Este tipo de dado deve ser utilizado para a criação de um identificar global para uma coluna de uma tabela. Também podemos possuir somente um campo como tipo UNIQUEIDENTIFIER por tabela. Este identificador deve ser utilizado quando temos certeza absoluta que nenhum valor para o campo deve ser repetido. Para alimentar o conteúdo deste campo, devemos preferencialmente utilizar a função NEWID() que retornar um identificador no formato desde tipo. Além destes tipos de dados básicos do SQL Server podemos criar colunas calculadas, baseadas em valores de outras colunas da mesma tabela. Por exemplo: CREATE TABLE ITENS_PED ( PED_COD INT NOT NULL, PED_PRC NUMERIC(6,2) NOT NULL, PED_QTD TINYINT NOT NULL , PED_TOT AS PED_QTD * PED_PRC ) Neste exemplo, a coluna calculada se chama PED_TOT e seu conteúdo é gerado através da multiplicação dos campos PED_QTD e PED_PRC. Para inserir ou alterar um registro não devemos passar o conteúdo do campo calculado. A instrução INSERT abaixo: INSERT INTO ITENS_PED VALUES(1,5.2,2) Gravará o seguinte registro: PED_COD PED_PRC PED_QTD PED_TOT ------------- ------------- ------------- ------------1 5.20 2 10.40 Devemos ter cuidado com as colunas calculadas, pois o seu valor não está fisicamente armazenada e sim gerada no momento em que o dado é requisitado ao banco de dados. Também devemos tomar cuidado com criação de índices em colunas computadas. A expressão utilizada na coluna computada (no nosso exemplo *) não pode ser uma sub-query. Para a conversão entre os diversos tipos de dados , quando possível, existem duas funções: CAST() e CONVERT(). Exemplos: -- CONVERTE UM INT PARA UM NUMERIC(10,2) SELECT CONVERT(NUMERIC(10,2),3) SELECT CAST ( 3 AS NUMERIC(10,2) ) -- CONVERTE UM NUMERIC(10,2) PARA UM INT SELECT CONVERT(INT,5.45) SELECT CAST ( 5.45 AS INT) -- CONVERTE UM VARCHAR PARA NUMERIC(10,2) SELECT CONVERT(NUMERIC(10,2),'5.45') SELECT CAST ( '5.45' AS NUMERIC(10,2)) -- CONVERTE UM INT PARA UM CHAR(5) SELECT CONVERT(CHAR(5) ,10325) SELECT CAST ( 10325 AS CHAR(5)) CONVERT() e CAST() possuem quase a mesma funcionalidade: CONVERT() permite utilizar uma estilo de formatação para data. Sempre que possível procure utilizar CAST() pois esta função segue o padrão ANSI. Consultando o Book On-Line podemos observar qual tipo de dados pode ser convertido para qual tipo e ainda podemos descobrir quando o SQL Server faz conversão automática de dados entre os tipos envolvidos em uma expressão.