Вы, кажется, путаете сравнение (a = b
) и назначение (SET @a = b
)
При сравнении VARCHAR
и INT
первый всегда приводится к последнему, поэтому этот запрос не будет выполнен:
SELECT 1
WHERE 'ab' = 1
, поскольку 'ab'
не может быть преобразовано в INT
.
В назначении исходное значение (b
) всегда приводится к типу цели (@a
):
DECLARE @av VARCHAR(100)
SET @av = 1
GO
DECLARE @ai INT
SET @ai = 'ab'
GO
Поскольку INT
всегда преобразуется в VARCHAR
, первая партия всегда будет успешной, в отличие от второй, которая преобразует VARCHAR
в INT
.