2013-06-28 4 views
7

После этого вопроса: «SQL: What does NULL as ColumnName imply» Я стал любопытным о том, какой тип данных будет SQL сервер выбрать для столбца в этом запросе:Тип данных Избранный SQL Server для Null Колонка

SELECT NULL as aColumn 

Так что я побежал это тесты:

select * from (select null as aaa) resulta 
UNION ALL 
select 6.54 

Yelds два ряда:

aaa 
--------------------------------------- 
NULL 
6.54 

В то время как этот:

select * from (select null as aaa) resulta 
UNION ALL 
select 'ab' 

В SQL Server 2000 yelded это:

aaa 
----------- 
NULL 
Msg 245, Level 16, State 1, Line 5 
Syntax error converting the varchar value 'ab' to a column of data type int. 

и в SQL Server 2008 дал это:

aaa 
---- 
NULL 
ab 

Таким образом, любое предположение относительно того, что тип данных SQL Server выбирает для всех нуль столбец?

+0

Я всегда брось, SELECT CAST (NULL, как VARCHAR (50)), как aColumn – JBrooks

+0

@JBrooks, спасибо, я обычно делаю то же самое. Я просто озадачен тем, что SQL Server делает внутренне, если я просто даю ему псевдоним без кастинга. – JoseTeixeira

ответ

6

SQL Server примет первый тип данных, который явно определен, в противном случае он выберет тип, который неявно хранит данные.

В вашем примере первое значение, которое оно может вводить, представляет собой числовое значение, основанное на десятичной точке. Следовательно, таблица определяется как таковая. Когда вы пытаетесь вставить текст, он не может выполнить преобразование.

Прочтите эту ссылку, чтобы получить представление о совместимых типах данных. Рядом с этим есть хорошая диаграмма.

http://msdn.microsoft.com/en-us/library/ms187928.aspx

3

В SQL Server 2008 я использовал это, чтобы создать временную таблицу, а затем запросить схему вновь созданной таблицы:

select null as col1 
into #test 

exec tempdb..sp_help '#test' 

Результаты показали, что столбец был внутр.

+0

Просто запустил следующий тест: 'select null как col1 в # test' ' select 1 as col1 в # test2', а затем выполнил 'exec tempdb..sp_help '# test''' exec tempdb..sp_help' # test2 ' '. Они получают один и тот же тип, но затем, когда я это делаю: 'select * from (select null as aaa) resulta UNION ALL select 'ab'' дает мне результаты и' select 1 UNION ALL select' ab'' дает ошибка преобразования 'varchar' в' int'. Поэтому я смущен тем, как SQL Server обрабатывает нуль в запросе. будет ли он присвоить тип столбцу только после того, как он выполнит некоторые оценки? – JoseTeixeira