It's because they aren't the same query -- your variable text does not get inlined into the query.
In query 1 you are validating that @c
is not null (true, you set it) and that its length is greater than 0 (true, it's 10). Since both are true, query 1 becomes:
select top 1 * from myTable
(It will return the first row in myTable based on an appropriate index.)
EDIT: Addressing the comments on the question.
declare @myTable table
(
columnName varchar(50)
)
insert into @myTable values ('8')
declare @c nvarchar(50)
set @c = 'columnName'
select top 1 *
from @myTable
where @c is not null
and len(convert(varchar, @c)) > 0
select top 1 *
from @myTable
where columnName is not null
and len(convert(varchar,columnName)) > 0
Now when I run this both queries return the same result. You'll have to tell me where I'm misrepresenting your actual data / query to get more help (or just expand upon this to find a solution).