Это касается короткого circuat оценки в SQL-сервере глубоко:
http://www.sqlservercentral.com/articles/T-SQL/71950/
Короче говоря: порядок оценки зависит от оптимизатора запросов.
Редактировать: Как отметил Мартин, это не гарантирует заказ, поскольку он также может быть оптимизирован. Из приведенной выше ссылки (я должен был прочитать его полностью):
При запуске против SQL Server 2000, не генерируется никакой ошибки, но SQL Server 2005 и 2008 лет осуществить оптимизацию, чтобы подтолкнуть не-SARGable предикатов в сканирование индекса из подзапроса, которое приводит к ошибке оператора .
Чтобы избежать этой проблемы, запрос можно переписать с использованием выражения CASE , возможно, немного неясного, но гарантированного не сработает.
Таким образом, это должно гарантировать, что ISNUMERIC
будет оцениваться первым:
SELECT aData.*,bData.*
FROM #TableA aData INNER JOIN #TableB bData
ON aData.id = CASE ISNUMERIC(bData.col1) WHEN 1 THEN CAST(bData.col1 AS INT) END
Игнорируйте мой первый подход (который не может работать каждый раз):
Вы должны изменить ваш присоединиться к убедитесь, что данные оцениваются правильно
:
SELECT aData.*,bData.*
FROM #TableA aData INNER JOIN
(
SELECT col1
FROM #TableB b
WHERE ISNUMERIC(b.col1) = 1
) AS bData
ON aData.id = CAST(bData.Col1 AS int)
Образец данных:
create table #TableA(id int)
create table #TableB(col1 varchar(10))
insert into #TableA values(1);
insert into #TableA values(2);
insert into #TableA values(3);
insert into #TableA values(4);
insert into #TableB values('1');
insert into #TableB values('2');
insert into #TableB values(null);
insert into #TableB values('4abc');
SELECT aData.*,bData.*
FROM #TableA aData INNER JOIN
(
SELECT col1
FROM #TableB b
WHERE ISNUMERIC(b.col1) = 1
) AS bData
ON aData.id = CAST(bData.Col1 AS int)
drop table #TableA;
drop table #TableB;
Результат:
id col1
1 1
2 2
родственный: [Является ли SQL WHERE оценивается положение короткого замыкания] (http://stackoverflow.com/questions/789231/is-the -sql-where-clause-short-circuit-rated) – AakashM