2010-12-09 2 views
2

У меня есть таблица, как этотSQL запросов с полями типа NUMERIC

CREATE TABLE MyTable (
    [MyTableID] [int] NOT NULL, 
    [Description] [varchar](50) NOT NULL, 
    CONSTRAINT [PK_AddressType] PRIMARY KEY CLUSTERED (
     [MyTableID] ASC 
    ) 
) ON [PRIMARY] 

Может кто-нибудь объяснить, почему следующий запрос работает, даже если я в том числе значение поля в одинарные кавычки?

SELECT * 
FROM MyTable 
WHERE MyTableID = '1' 

Является ли это особенностью SQL Server? Это ANSI/SQL?

ответ

6

То, что вы продемонстрировали, обычно называют неявным преобразованием данных - данные автоматически преобразуются в тип данных сравниваемого столбца. Поскольку строка со значением «1» может быть преобразована в числовой тип данных со значением 1, все работает нормально. Неявные преобразования типов данных могут возникать в соответствии с precedence list.

Явное преобразование данных - это когда вы используете такие функции, как CAST or CONVERT.

String to numeric (и наоборот) поддерживается во всех базах данных, которые я знаю - SQL Server, Oracle, MySQL, PostgreSQL ... Функция CAST - ANSI, IIRC. Другие типы данных не так гибки - даты & datetimes, например.

+0

Этот тип неявного преобразования данных является специфичным для SQL Server правильно? Я почти уверен, что запрос потерпит неудачу в отношении Oracle и DB2 – Lorenzo

+0

@Lorenzo: я обновлялся во время комментирования, но нет - это не относится к SQL Server. –

+0

Хорошо! Большое спасибо за объяснение. Я только что обнаружил это, пока я пытался вызвать ошибку в моем коде. Если бы я знал это раньше, некоторые из построителей запросов, которые я написал, были намного проще :) – Lorenzo

3

В дополнение к ответам OMG Ponies.

Неявные преобразования типа данных могут возникать в соответствии с precedence list здесь.

Они могут быть источником проблем с производительностью, когда тип данных константы или параметра в предикате имеет более высокий приоритет, чем тип столбца. В этом случае значения столбцов должны будут иметь неявное преобразование, что означает, что индекс не может быть использован.

+1

Я добавил список приоритетов к своему ответу; Я все время забываю об этом. –

Смежные вопросы