2012-02-06 1 views
2

Ниже приведен пример запрос:запроса с использованием производной таблицы с IsNumeric приводит к неспособности преобразования (VarChar в Int)

DECLARE @table table (loc varchar(10)) 

INSERT INTO @table VALUES 
('134a'), ('123'), ('abc'), ('124') 

SELECT * 
FROM (
    SELECT * FROM @table WHERE ISNUMERIC(loc) = 1 
) as a 
WHERE CAST(loc as INT) BETWEEN 100 AND 200 

Если у меня есть некоторые значения VarChar, и я ограничить их числовые значения с помощью ISNUMERIC в производной таблице в запросе, почему это приводит к ошибке преобразования ?:

Ошибка преобразования при преобразовании значения varchar '134a' в тип данных int.

Есть ли способ обойти это?

+0

возможно дубликат [SQL Server 2008: Ошибка преобразования типа данных NVARCHAR плавать] (http://stackoverflow.com/questions/9136722/sql-server-2008-error-converting-data-type -nvarchar-to-float) – GSerg

+0

Чтобы уточнить: не имеет значения, что у вас есть это ограничение как подзапрос. SQL Server размотал его, потому что он легко мог. – GSerg

+1

@GSerg Можете ли вы подробно остановиться на «потому что это легко может»? – MikeM

ответ

5

Предложение WHERE выполняется первым. Попробуйте:

DECLARE @table table (loc varchar(10)) 

INSERT INTO @table VALUES 
('134a'), ('123'), ('abc'), ('124') 

SELECT * 
FROM ( 
    SELECT * FROM @table 
) as a 
WHERE ISNUMERIC(loc) = 1 and CAST(loc as INT) BETWEEN 100 AND 200 
+0

Есть ли способ убедиться, что 'ISNUMERIC (loc)' будет выполняться до 'CAST (loc as INT) BETWEEN 100 AND 200'? – MikeM

+0

SQL Server гарантирует, что операторы с равным приоритетом будут оцениваться слева направо, но нет никакой гарантии относительно вычисления коротких замыканий булевых выражений. Более того, представляется, что поведение может варьироваться в разных контекстах, например. 'IF',' CASE' и 'WHERE'. Хотелось бы, чтобы я мог ссылаться на авторитетную ссылку, которая уложила бы это в постель. Или что они будут поддерживать явные операторы 'AND_THEN' и' OR_ELSE', как некоторые другие языки. – HABO