Varchar sem tamanho definido

sexta-feira, 30 de outubro de 2009

Responda rápido, qual o resultado deste SELECT:

DECLARE @teste varchar(40)
SET @teste = '1111111111222222222233333333334444444444'
go
SELECT CONVERT(varchar, @teste)
-- OU
SELECT CAST(@teste as varchar)

Se você respondeu '1' ou '1111111111222222222233333333334444444444', errou.

Quando não se informa o tamanho do datatype de uma variável do tipo varchar, o padrão é sempre 30. Ou seja, a resposta correta é '111111111122222222223333333333'.

Então, ao criar uma tabela não se especificar o tamanho campo de tipo varchar, seria 30 também? Este INSERT seria possível?

CREATE TABLE #teste (campo varchar)
INSERT INTO #teste VALUES ('111111111122222222223333333333')

Erro:
String or binary data would be truncated.
The statement has been terminated.

Não, quando não se especifica tamanho de uma coluna do tipo varchar, o tamanho default é 1. Portanto:


CREATE TABLE #teste (campo varchar)
GO

INSERT INTO #teste VALUES ('1');

SELECT * FROM #teste

campo
-----
1

(1 row(s) affected)


Referência: http://msdn.microsoft.com/en-us/library/ms176089%28SQL.90%29.aspx


Para finalizar, apenas como curiosidade, é possível criar uma variável ou campo em uma tabela informando um sinônimo de tipo de dados. Exemplos:

DECLARE @nome character varying(20)
SET @nome = 'Renata'
SELECT @nome

-- e ainda

CREATE TABLE #teste (
id integer,
nome character varying(40),
salario double precision
)
GO

INSERT INTO #teste (id, nome, salario) VALUES (1,'Maria', 5230.5)
GO


Neste exemplo, ao invés de int, foi colocado integer. No lugar de varchar, character varying. E no lugar de float, foi colocado double precision.

Ao verificar a estrutura da tabela criada, ela foi criada conforme o tipo de dados de sistema do SQL Server.

USE tempdb
go

SP_HELP #teste

Resultado:



Column_name Type Computed Length Prec Scale Nullable TrimTrailingBlanks FixedLenNullInSource Collation
--------------- ------------------- ----------- ------- ------- ------- ----------- ------------------- ----------------------- -----------------------------
id int no 4 10 0 yes (n/a) (n/a) NULL
nome varchar no 40 yes no yes SQL_Latin1_General_CP1_CI_AS
salario float no 8 53 NULL yes (n/a) (n/a) NULL

A lista completa de sinônimos se encontra aqui: http://msdn.microsoft.com/en-usprecision/library/ms177566%28SQL.90%29.aspxstyle

0 comentários: